Sinon.js: ইউনিট টেস্টের জন্য স্পাই, স্টাব এবং মক
Sinon.js একটি স্বতন্ত্র জাভাস্ক্রিপ্ট লাইব্রেরি যা ইউনিট টেস্টিং-এ টেস্ট ডাবলস (test doubles) তৈরি করার জন্য ব্যবহৃত হয়। এটি কোডের নির্দিষ্ট অংশকে আইসোলেট করে টেস্ট করার সুবিধা দেয়।
মূল তিনটি কম্পোনেন্ট
1. Spies (স্পাই)
- নকল ফাংশন যা ফাংশন কল ট্র্যাক করে।
- কল কতবার হয়েছে, কোন আর্গুমেন্ট দিয়ে কল হয়েছে, রিটার্ন মান কী ছিল — সব রেকর্ড রাখে।
- মূল ফাংশনের আচরণ পরিবর্তন করে না।
const spy = sinon.spy(obj, 'method');
obj.method(1, 2);
console.log(spy.callCount); // 1
console.log(spy.args[0]); // [1, 2]
2. Stubs (স্টাব)
- ফাংশন সম্পূর্ণরূপে প্রতিস্থাপন করে।
- নির্দিষ্ট রিটার্ন মান, এরর থ্রো, বা কাস্টম আচরণ ডিফাইন করা যায়।
- বাহ্যিক নির্ভরতা (API কল, ডাটাবেস, টাইমার) মক করার জন্য আদর্শ।
const stub = sinon.stub(api, 'fetchUser').returns(Promise.resolve({id: 1, name: 'Test'}));
3. Mocks (মক)
- অবজেক্টের পূর্ণ আচরণ সংজ্ঞায়িত করে (স্পাই + স্টাবের সংমিশ্রণ)।
- এক্সপেক্টেশন সেট করা যায়: "এই ফাংশন একবার কল হবে এবং সফল হবে"।
- টেস্ট শেষে
mock.verify()দিয়ে যাচাই করা হয়।
কেন Sinon.js ব্যবহার করবেন?
- টেস্ট দ্রুত, নির্ভরশীল এবং আইসোলেটেড হয়।
- বাহ্যিক সার্ভিস (REST API, DB) ছাড়া টেস্ট করা যায়।
- এজ কেস (এরর, টাইমআউট, নেটওয়ার্ক ফেইল) সিমুলেট করা সহজ।
- প্রচলিত টেস্ট ফ্রেমওয়ার্ক (Mocha, Jest, Jasmine) এর সাথে খুব ভালো ইন্টিগ্রেট হয়।
উদাহরণ: API কল স্টাব করা
// টেস্ট ফাইলে
sinon.stub(window, 'fetch').resolves({
ok: true,
json: () => Promise.resolve({data: 'mocked'})
});
// প্রোডাকশন কোড変わらず
const response = await fetch('/api/data'); // মকড রেসপন্স मिलेगा
Sinon.js আধুনিক জাভাস্ক্রিপ্ট টেস্টিং-এর অপরিহার্য একটি টুল।