JasmineJS সিঙ্ক্রোনাস (synchronous) টেস্টিংয়ের জন্য ডিজাইন করা হলেও, কখনো কখনো আমাদের অ্যাসিঙ্ক্রোনাস (asynchronous) কোড টেস্ট করতে হয়। উদাহরণস্বরূপ, যখন কোনো ফাংশন API কল করে, ডাটাবেসে কাজ করে, অথবা কোনো টাইমআউট সেট করে, তখন ঐ ফাংশনের আউটপুট আসতে কিছু সময় লাগতে পারে। JasmineJS এই ধরনের অ্যাসিঙ্ক্রোনাস কোড টেস্ট করার জন্য কয়েকটি উপায় প্রদান করে।
JasmineJS এ Asynchronous টেস্টিং এর পদ্ধতি
JasmineJS এ অ্যাসিঙ্ক্রোনাস টেস্টিং করার জন্য সাধারণত done(), async/await, এবং setTimeout() ব্যবহার করা হয়। নিচে এগুলোর ব্যাখ্যা দেওয়া হলো।
done() Callback Function
JasmineJS এ অ্যাসিঙ্ক্রোনাস টেস্ট করার জন্য done() ফাংশনটি ব্যবহার করা হয়। এই ফাংশনটি ব্যবহার করে আপনি JasmineJS কে জানাতে পারেন যে, টেস্টটি সম্পূর্ণ হতে আরও কিছু সময় লাগবে এবং এই সময়ের মধ্যে টেস্টটি শেষ হয়ে যাবে।
উদাহরণ:
ধরা যাক, আমাদের একটি অ্যাসিঙ্ক্রোনাস ফাংশন আছে, যা ২ সেকেন্ড পর কিছু ডাটা রিটার্ন করে।
function fetchData(callback) {
setTimeout(function() {
callback("Data received");
}, 2000);
}
এখন এই ফাংশনটির জন্য JasmineJS এ টেস্ট তৈরি করা যাক।
describe("Asynchronous Testing", function() {
it("should fetch data correctly", function(done) {
fetchData(function(data) {
expect(data).toBe("Data received");
done(); // done() কল করলে Jasmine টেস্টটি শেষ হতে জানাবে
});
});
});
এখানে:
done(): এটি একটি কলব্যাক ফাংশন যা Jasmine কে জানায় যে অ্যাসিঙ্ক্রোনাস কাজটি শেষ হয়ে গেছে।- Jasmine টেস্ট রান করবে এবং যখন
done()কল হবে, তখন টেস্টটি পাস বা ফেইল হবে।
async/await ব্যবহার করে অ্যাসিঙ্ক্রোনাস টেস্টিং
JasmineJS ES6-এর async/await সাপোর্ট করে, যা কোডটিকে আরও পরিষ্কার এবং সহজ করে তোলে। async/await ব্যবহার করে আপনি অ্যাসিঙ্ক্রোনাস কোড ব্লকগুলো সিঙ্ক্রোনাসভাবে লিখতে পারেন, এবং JasmineJS তার সাথে অ্যাসিঙ্ক্রোনাস টেস্টিং করতে পারবে।
উদাহরণ:
ধরা যাক, আমাদের একটি অ্যাসিঙ্ক্রোনাস ফাংশন আছে, যা Promise রিটার্ন করে:
function fetchData() {
return new Promise((resolve) => {
setTimeout(function() {
resolve("Data received");
}, 2000);
});
}
এখন, JasmineJS এ এই ফাংশনটির টেস্ট লিখতে আমরা async/await ব্যবহার করব:
describe("Asynchronous Testing with async/await", function() {
it("should fetch data correctly", async function() {
const data = await fetchData();
expect(data).toBe("Data received");
});
});
এখানে:
async: এই কীওয়ার্ডটি ফাংশনকে অ্যাসিঙ্ক্রোনাস করে তোলে।await: এটিPromise-এর রেজাল্ট পাওয়া না পর্যন্ত ফাংশনটি অপেক্ষা করবে।
Jasmine এ async/await ব্যবহার করলে কোডটি অনেক পরিষ্কার এবং সহজে রিডেবল হয়।
setTimeout() ব্যবহার করে অ্যাসিঙ্ক্রোনাস টেস্টিং
আপনি যদি কোনো নির্দিষ্ট সময়ের জন্য অ্যাসিঙ্ক্রোনাস কাজ (যেমন টাইমআউট) করতে চান, তবে Jasmine এর setTimeout() ব্যবহার করতে পারেন।
উদাহরণ:
describe("Testing with setTimeout", function() {
it("should complete after 2 seconds", function(done) {
setTimeout(function() {
expect(true).toBe(true); // ২ সেকেন্ড পর টেস্ট সম্পূর্ণ হবে
done(); // done() কল করতে হবে যাতে Jasmine টেস্ট শেষ হয়ে যায়
}, 2000);
});
});
এখানে:
setTimeout(): ২ সেকেন্ড পর একটি অ্যাসারশন পরীক্ষা করা হচ্ছে।done(): অ্যাসিঙ্ক্রোনাস কাজ শেষ হলে Jasmine এ টেস্ট শেষ হওয়ার জন্যdone()কল করা হয়।
Promise এবং async/await এর মধ্যে পার্থক্য
Promise:Promiseহল একটি ওয়েটিং অবজেক্ট যা অ্যাসিঙ্ক্রোনাস অপারেশন সম্পন্ন হলে ফলাফল বা এরর রিটার্ন করে। এটিresolveএবংrejectদিয়ে অ্যাসিঙ্ক্রোনাস ফলাফল সঙ্কেত দেয়।async/await:async/awaitআধুনিক JavaScript সিনট্যাক্স যাPromiseএর উপর ভিত্তি করে কাজ করে, কিন্তু এটি কোডকে আরও সহজ এবং সরল করে তোলে, যেহেতু এটি সিঙ্ক্রোনাস কোডের মতো আচরণ করে।
JasmineJS এ অন্যান্য অ্যাসিঙ্ক্রোনাস টেস্টিং কৌশল
JasmineJS এ অ্যাসিঙ্ক্রোনাস কোড টেস্ট করার জন্য বিভিন্ন কৌশল ব্যবহার করা যায়, যেমন:
- ব্যাচ টেস্টিং: একাধিক অ্যাসিঙ্ক্রোনাস টেস্ট একসাথে চালানো।
- নেস্টেড অ্যাসিঙ্ক্রোনাস ফাংশন: কখনো কখনো একাধিক অ্যাসিঙ্ক্রোনাস ফাংশন একে অপরের সাথে ইন্টারঅ্যাক্ট করে, সেক্ষেত্রে
done()বাasync/awaitব্যবহার করতে হবে।
সারাংশ
JasmineJS এ অ্যাসিঙ্ক্রোনাস টেস্টিং করার জন্য প্রধানত তিনটি পদ্ধতি রয়েছে:
done()callback function: এটি অ্যাসিঙ্ক্রোনাস টেস্টের শেষে কল করে Jasmine কে জানায় যে টেস্ট সম্পূর্ণ হয়েছে।async/await: আধুনিক JavaScript সিনট্যাক্স, যা অ্যাসিঙ্ক্রোনাস কোডকে সিঙ্ক্রোনাসভাবে লেখার সুবিধা দেয়।setTimeout(): একটি নির্দিষ্ট সময় পর টেস্ট সম্পন্ন করার জন্য ব্যবহৃত হয়।
JasmineJS এ অ্যাসিঙ্ক্রোনাস কোড টেস্টিং সঠিকভাবে করা হলে, আপনার কোডের স্থিতিশীলতা এবং নির্ভুলতা নিশ্চিত করা সহজ হবে।
JasmineJS মূলত synchronous টেস্টিং এর জন্য তৈরি করা হলেও, আপনি asynchronous কোডের জন্যও টেস্ট তৈরি করতে পারেন। অনেক সময় আপনার কোডের মধ্যে API কল, টাইমআউট বা Promises থাকতে পারে, যা asynchronous ফাংশন হিসেবে কাজ করে। JasmineJS এ asynchronous কোড টেস্ট করার জন্য কিছু বিশেষ পদ্ধতি রয়েছে।
Asynchronous কোড টেস্ট করার উপায়
JasmineJS এ asynchronous টেস্ট করতে done() callback ফাংশন, async/await, এবং Promises ব্যবহৃত হয়। আপনি যেভাবে asynchronous কোড লিখেছেন, সেভাবেই JasmineJS এ টেস্ট করতে পারবেন।
1. done() Callback ব্যবহার
JasmineJS এ asynchronous টেস্ট করার সবচেয়ে পুরানো এবং সাধারণ পদ্ধতি হল done() callback ব্যবহার করা। এটি Jasmine কে জানায় যে, টেস্টের কাজ শেষ হলে টেস্টটি পাস বা ফেইল হবে।
উদাহরণ:
describe("Asynchronous Testing with done()", function() {
it("should fetch data from API", function(done) {
const fetchData = function(callback) {
setTimeout(function() {
callback("Data fetched");
}, 1000);
};
fetchData(function(result) {
expect(result).toBe("Data fetched");
done(); // done() কল না করলে Jasmine এটি শেষ হবে না বলে মনে করবে
});
});
});
এখানে:
done()ফাংশনটি Jasmine কে জানায় যে টেস্টটি asynchronous এবং এটি শেষ হলে Jasmine টেস্ট ফলাফল যাচাই করবে।setTimeoutব্যবহার করে আমরা ডিলেইড (delayed) asynchronous কোড সিমুলেট করেছি, এবংdone()কলের মাধ্যমে Jasmine জানানো হয়েছে যে, টেস্ট শেষ হয়েছে।
2. async/await ব্যবহার
async/await এর মাধ্যমে আপনি asynchronous কোডকে আরো পড়তে সহজ এবং সুসংগতভাবে লিখতে পারেন। JasmineJS এই পদ্ধতিটি সাপোর্ট করে, এবং এটি promises এর উপর ভিত্তি করে কাজ করে।
উদাহরণ:
describe("Asynchronous Testing with async/await", function() {
it("should fetch data from API", async function() {
const fetchData = function() {
return new Promise(function(resolve) {
setTimeout(function() {
resolve("Data fetched");
}, 1000);
});
};
const result = await fetchData();
expect(result).toBe("Data fetched");
});
});
এখানে:
async/awaitএর মাধ্যমে আপনি asynchronous ফাংশনকে অপেক্ষা (wait) করে নিতে পারেন। এটি কোডকে synchronous-এর মতো দেখতে এবং পড়তে সহজ করে তোলে।fetchData()একটি promise ফেরত দেয়, এবং আমরাawaitব্যবহার করে এর ফলাফলটি অপেক্ষা করে পাওয়ার পরexpect()দিয়ে যাচাই করেছি।
3. Promise ব্যবহার
Promises ব্যবহার করেও asynchronous কোড টেস্ট করা সম্ভব। JasmineJS promises কে সরাসরি সমর্থন করে এবং আপনি একটি promise রিটার্ন করলে Jasmine তার উপর ভিত্তি করে টেস্ট সম্পূর্ণ করার আগ পর্যন্ত অপেক্ষা করে।
উদাহরণ:
describe("Asynchronous Testing with Promises", function() {
it("should fetch data from API", function() {
const fetchData = function() {
return new Promise(function(resolve) {
setTimeout(function() {
resolve("Data fetched");
}, 1000);
});
};
return fetchData().then(function(result) {
expect(result).toBe("Data fetched");
});
});
});
এখানে:
returnএর মাধ্যমে আপনি Jasmine কে জানাচ্ছেন যে এটি একটি asynchronous টেস্ট এবং Jasmine সেই promise সম্পন্ন না হওয়া পর্যন্ত টেস্টটি শেষ হবে না।then()এর মাধ্যমে promise এর রেজাল্ট হাতে পাওয়ার পর আমরা যাচাই করেছি।
4. done.fail() ব্যবহার
JasmineJS এ done.fail() ব্যবহার করা যায় যাতে asynchronous কোডের ক্ষেত্রে কোনো ত্রুটি ঘটলে টেস্টটি ব্যর্থ (fail) ঘোষণা করা হয়। এটি done() এর পরিবর্তে ব্যবহৃত হয় যখন আপনি asynchronous কোডের মধ্যে কোনো ত্রুটি দেখেন।
উদাহরণ:
describe("Asynchronous Testing with done.fail()", function() {
it("should handle errors in asynchronous code", function(done) {
const fetchData = function() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
reject("Data fetch failed");
}, 1000);
});
};
fetchData().then(function() {
done(); // যদি ফাংশন সফল হয় তবে done() কল হবে
}).catch(function(error) {
done.fail(error); // যদি কোনো ত্রুটি ঘটে তবে done.fail() কল হবে
});
});
});
এখানে:
done.fail()ব্যবহার করা হয়েছে ত্রুটি (error) ধরা হলে টেস্টটি ব্যর্থ করতে। এই পদ্ধতিতে আপনি যদি asynchronous কোডে কোনো সমস্যা বা ত্রুটি পান, তবে Jasmine এটি ধরবে এবং টেস্টকে ব্যর্থ ঘোষণা করবে।
5. beforeEach() এবং afterEach() এর সাথে Asynchronous কোড
আপনি যদি beforeEach() এবং afterEach() এর মধ্যে asynchronous কোড ব্যবহার করতে চান, তাহলে আপনি done(), async/await, অথবা Promises ব্যবহার করতে পারেন।
উদাহরণ:
describe("Asynchronous Testing with beforeEach()", function() {
let data;
beforeEach(function(done) {
const fetchData = function() {
return new Promise(function(resolve) {
setTimeout(function() {
resolve("Data fetched in beforeEach");
}, 1000);
});
};
fetchData().then(function(result) {
data = result;
done(); // done() কল করার মাধ্যমে Jasmine জানাবে যে beforeEach() শেষ হয়েছে
});
});
it("should use data from beforeEach", function() {
expect(data).toBe("Data fetched in beforeEach");
});
});
এখানে:
beforeEach()এর মধ্যে asynchronous কোড ব্যবহার করা হয়েছে।done()ব্যবহার করে Jasmine এ জানানো হয়েছে যে টেস্ট সেটআপ শেষ হয়েছে।it()ব্লকের মধ্যে আমরাdataচেক করেছি যাbeforeEach()এর মাধ্যমে সেট করা হয়েছে।
সারাংশ
JasmineJS এ asynchronous কোড টেস্ট করার জন্য বিভিন্ন পদ্ধতি রয়েছে:
done()callback ফাংশন: এটি Jasmine কে জানাতে সাহায্য করে যে asynchronous টেস্ট শেষ হয়েছে।async/await: এটি asynchronous কোডকে আরও পড়তে সহজ এবং সুসংগত করে তোলে।- Promises: Jasmine promises কে সরাসরি সমর্থন করে, এবং আপনি
returnব্যবহার করে Jasmine কে জানাতে পারেন যে এটি একটি asynchronous টেস্ট। done.fail(): এটি asynchronous টেস্টে ত্রুটি (error) হলে টেস্টটি ব্যর্থ করতে ব্যবহৃত হয়।
এই পদ্ধতিগুলি ব্যবহার করে আপনি সহজেই asynchronous কোডের টেস্টিং করতে পারেন।
JasmineJS মূলত সিঙ্ক্রোনাস টেস্টিং এর জন্য ডিজাইন করা হলেও, এটি অ্যাসিঙ্ক্রোনাস (Asynchronous) কোড টেস্ট করার জন্যও সমর্থন প্রদান করে। অ্যাসিঙ্ক্রোনাস টেস্টে এমন কোড থাকে যা সময় নেয়, যেমন AJAX রিকোয়েস্ট, টাইমআউট, অথবা প্যারালাল প্রসেসিং। JasmineJS এ অ্যাসিঙ্ক্রোনাস টেস্ট করার জন্য done() ফাংশনটি ব্যবহৃত হয়।
done() ফাংশনটি অ্যাসিঙ্ক্রোনাস টেস্টের মধ্যে একটি সিগন্যাল পাঠায় যে টেস্টটি শেষ হয়ে গেছে এবং Jasmine তার ফলাফল রিপোর্ট করতে পারে। এটি সাধারণত it() ব্লকের মধ্যে ব্যবহৃত হয়।
done() ফাংশন এর ব্যবহার
JasmineJS এ অ্যাসিঙ্ক্রোনাস টেস্ট করার জন্য done() ফাংশনটি ব্যবহার করতে হয়। আপনি যখন একটি অ্যাসিঙ্ক্রোনাস অপারেশন চালান, যেমন একটি ফাইল লোড করা বা API কল করা, তখন done() ফাংশনটি কল করার মাধ্যমে টেস্টের শেষ হতে JasmineJS কে জানানো হয়।
Syntax:
it("should do something asynchronously", function(done) {
// অ্যাসিঙ্ক্রোনাস অপারেশন এখানে
someAsyncFunction(function(result) {
expect(result).toBe(true); // পরীক্ষার ফলাফল
done(); // done() কল করলে Jasmine জানবে টেস্টটি শেষ হয়েছে
});
});
উদাহরণ: done() ফাংশন সহ অ্যাসিঙ্ক্রোনাস টেস্ট
ধরা যাক, আমরা একটি অ্যাসিঙ্ক্রোনাস ফাংশন পরীক্ষা করতে চাই, যা একটি সময়সীমা নিয়ে কাজ করে এবং পরে একটি ফলাফল প্রদান করে।
describe("Asynchronous Test Example", function() {
it("should complete the task asynchronously", function(done) {
setTimeout(function() {
const result = true; // অ্যাসিঙ্ক্রোনাস কোডের আউটপুট
expect(result).toBe(true); // এখানে আমরা পরীক্ষা করছি যদি result সত্যি হয়
done(); // done() কল করলে Jasmine বুঝবে টেস্টটি শেষ
}, 1000); // ১ সেকেন্ডের টাইমআউট
});
});
এখানে:
setTimeout(): একটি টাইমআউট ফাংশন ব্যবহার করা হয়েছে, যা ১ সেকেন্ড পর কোডের এক্সিকিউশন সম্পন্ন করে।done(): যখন অ্যাসিঙ্ক্রোনাস কাজটি সম্পন্ন হয়, তখনdone()কল করা হয়। এটি JasmineJS কে জানিয়ে দেয় যে টেস্টের কার্যক্রম শেষ হয়েছে এবং Jasmine এর ফলাফল রিপোর্ট করতে পারে।
অ্যাসিঙ্ক্রোনাস ফাংশন কল করার অন্যান্য পদ্ধতি
Promise ভিত্তিক অ্যাসিঙ্ক্রোনাস টেস্ট
JasmineJS promises (ES6 promises) এর জন্যও সমর্থন প্রদান করে। আপনি যদি প্রমিস (Promise) ব্যবহার করেন, তবে done() এর পরিবর্তে আপনি return ব্যবহার করতে পারেন, যা Jasmine কে জানিয়ে দেয় টেস্টটি অ্যাসিঙ্ক্রোনাস এবং তার ফলাফল রিটার্ন করতে হবে।
উদাহরণ:
describe("Asynchronous Test with Promise", function() {
it("should resolve the promise", function() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(true); // ১ সেকেন্ড পরে প্রমিস রেজলভ করা হবে
}, 1000);
}).then(function(result) {
expect(result).toBe(true); // প্রমিস রেজলভ হলে result পরীক্ষা করা হচ্ছে
});
});
});
এখানে:
return: JasmineJS এর জন্য প্রমিস রিটার্ন করা হচ্ছে। Jasmine বুঝবে যে এটি একটি অ্যাসিঙ্ক্রোনাস টেস্ট এবং প্রমিস রেজলভ হওয়া পর্যন্ত অপেক্ষা করবে।
async/await এর মাধ্যমে অ্যাসিঙ্ক্রোনাস টেস্ট
ES6 এর async/await এর মাধ্যমে অ্যাসিঙ্ক্রোনাস কোড আরও সহজভাবে লেখা যায়। JasmineJS অ্যাসিঙ্ক্রোনাস টেস্টের জন্য async/await এর ব্যবহারেরও সমর্থন প্রদান করে।
উদাহরণ:
describe("Asynchronous Test with async/await", function() {
it("should resolve the async function", async function() {
const result = await new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(true); // ১ সেকেন্ড পরে প্রমিস রেজলভ
}, 1000);
});
expect(result).toBe(true); // প্রমিস রেজলভ হলে result পরীক্ষা
});
});
এখানে:
async/await: এই পদ্ধতিতে আমরাawaitব্যবহার করে প্রমিসের রেজলভ হওয়া পর্যন্ত অপেক্ষা করি, এবং পরে টেস্টের ফলাফল পরীক্ষা করি।
done() ফাংশন ব্যবহার না করার সময়
যদি আপনি done() ব্যবহার না করেন, তবে Jasmine অ্যাসিঙ্ক্রোনাস টেস্টটিকে সিঙ্ক্রোনাস (যতটুকু সম্ভব) হিসেবে গণ্য করবে এবং টেস্টটি সময়ের মধ্যে শেষ না হওয়ার কারণে ফেল করবে। সুতরাং অ্যাসিঙ্ক্রোনাস কোডে done() বা প্রমিস ব্যবহার করা অপরিহার্য।
সারাংশ
done()ফাংশন: অ্যাসিঙ্ক্রোনাস টেস্টের ক্ষেত্রে JasmineJS কে জানাতে ব্যবহৃত হয় যে টেস্টটি শেষ হয়েছে এবং ফলাফল রিপোর্ট করা যেতে পারে।- অ্যাসিঙ্ক্রোনাস কোডের জন্য Promise এবং async/await পদ্ধতি ব্যবহার করা যেতে পারে।
done()ব্যবহার করার মাধ্যমে আপনি নিশ্চিত করতে পারবেন যে Jasmine অ্যাসিঙ্ক্রোনাস কোডের কার্যক্রম শেষ হওয়ার পর রিপোর্ট করবে।
JasmineJS এর মাধ্যমে অ্যাসিঙ্ক্রোনাস টেস্ট লেখা সহজ এবং কার্যকরী, যা সঠিকভাবে টেস্ট প্রক্রিয়াকে সমর্থন করে।
JasmineJS এ Promises এবং Async/Await ব্যবহার করে আপনি অ্যাসিঙ্ক্রোনাস কোডের টেস্ট করতে পারেন। অ্যাসিঙ্ক্রোনাস কোডের সাথে কাজ করার জন্য JasmineJS দুটি মূল পদ্ধতি প্রদান করে: Promises এবং Async/Await। এই দুটি পদ্ধতিই সঠিকভাবে টেস্ট লেখার সময় গুরুত্বপূর্ণ, বিশেষ করে যখন আপনি API কল, ডেটাবেস অপারেশন বা দীর্ঘ সময়ের কার্যক্রম টেস্ট করছেন।
Promises ব্যবহার করে টেস্ট করা
JasmineJS Promise ভিত্তিক অ্যাসিঙ্ক্রোনাস টেস্টিং সমর্থন করে। যখন একটি Promise রিটার্ন করা হয়, JasmineJS এ done ফাংশন ব্যবহার করে টেস্টের সমাপ্তি সঠিকভাবে সিগন্যাল করা হয়।
সঠিক ব্যবহার:
describe("Testing Promises", function() {
it("should resolve the promise correctly", function(done) {
const promise = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve("Success");
}, 1000);
});
promise.then(function(result) {
expect(result).toBe("Success"); // Promise সফলভাবে "Success" রিটার্ন করবে
done(); // টেস্টটি শেষ হওয়ার জন্য done কল করতে হবে
});
});
it("should reject the promise", function(done) {
const promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject("Error");
}, 1000);
});
promise.catch(function(error) {
expect(error).toBe("Error"); // Promise ত্রুটি হিসেবে "Error" রিটার্ন করবে
done(); // টেস্টটি শেষ হওয়ার জন্য done কল করতে হবে
});
});
});
এখানে:
done()ফাংশনটি ব্যবহার করা হয়েছে টেস্টের সমাপ্তি চিহ্নিত করতে। এটি নির্দেশ করে যে অ্যাসিঙ্ক্রোনাস অপারেশনটি শেষ হয়ে গেছে এবং টেস্টটি পাস/ফেইল হয়েছে।- প্রথম টেস্টে Promise সফলভাবে
"Success"রিটার্ন করবে এবং দ্বিতীয় টেস্টে এটি"Error"রিটার্ন করবে।
Async/Await ব্যবহার করে টেস্ট করা
JasmineJS-এ async এবং await ব্যবহার করে অ্যাসিঙ্ক্রোনাস কোড টেস্ট করা আরও সহজ হয়ে যায়। এটি কোডকে আরও পরিষ্কার এবং পড়তে সহজ করে তোলে, কারণ এখানে done() কল করার প্রয়োজন হয় না এবং আপনি অপেক্ষা করতে পারেন যেকোনো অ্যাসিঙ্ক্রোনাস অপারেশনের ফলাফলের জন্য।
সঠিক ব্যবহার:
describe("Testing Async/Await", function() {
it("should resolve the promise correctly", async function() {
const result = await new Promise(function(resolve, reject) {
setTimeout(function() {
resolve("Success");
}, 1000);
});
expect(result).toBe("Success"); // Promise সফলভাবে "Success" রিটার্ন করবে
});
it("should reject the promise", async function() {
try {
await new Promise(function(resolve, reject) {
setTimeout(function() {
reject("Error");
}, 1000);
});
} catch (error) {
expect(error).toBe("Error"); // Promise ত্রুটি হিসেবে "Error" রিটার্ন করবে
}
});
});
এখানে:
asyncফাংশনটি নির্দেশ করে যে এটি অ্যাসিঙ্ক্রোনাস, এবংawaitএর মাধ্যমে আপনি Promise রেজাল্টের জন্য অপেক্ষা করেন।- প্রথম টেস্টে Promise সফলভাবে
"Success"রিটার্ন করবে এবং দ্বিতীয় টেস্টে এটি"Error"রিটার্ন করবে। awaitব্যবহারের ফলেdone()কল করার প্রয়োজন নেই, টেস্টটি স্বয়ংক্রিয়ভাবে শেষ হয়ে যাবে।
Promise এবং Async/Await এর মধ্যে পার্থক্য
- Promises: Promise ভিত্তিক টেস্টিং-এ
done()ফাংশন ব্যবহার করা হয়, যা অ্যাসিঙ্ক্রোনাস কোড সম্পন্ন হওয়া সিগন্যাল দেয়। এটি ঐতিহ্যবাহী পদ্ধতি, যেখানে অ্যাসিঙ্ক্রোনাস অপারেশন সম্পন্ন হলেdone()কল করা হয়। - Async/Await:
asyncএবংawaitকোডের লেখার পদ্ধতিকে আরও সোজা এবং সুসংগঠিত করে তোলে। এখানে আপনি Promise এর ফলাফলের জন্য সরাসরি অপেক্ষা করতে পারেন এবংdone()কলের প্রয়োজন হয় না।
Promise এবং Async/Await এর একত্রিত ব্যবহার
আপনি চাইলে Promise এবং async/await একই টেস্টে একত্রে ব্যবহার করতে পারেন। তবে এটি সঠিকভাবে ব্যাবহার করার সময় বুঝে করা উচিত।
উদাহরণ:
describe("Async/Await with Promises", function() {
it("should resolve promise using async/await", async function() {
const result = await new Promise(function(resolve) {
setTimeout(function() {
resolve("Resolved");
}, 500);
});
expect(result).toBe("Resolved"); // Promise সফলভাবে "Resolved" রিটার্ন করবে
});
});
এখানে:
- Promise ব্যবহৃত হয়েছে
async/awaitপদ্ধতির সঙ্গে মিলিয়ে টেস্টে, ফলে কোডটি আরো পরিষ্কার এবং পড়তে সহজ হয়েছে।
সারাংশ
JasmineJS-এ Promises এবং Async/Await ব্যবহার করে অ্যাসিঙ্ক্রোনাস কোড টেস্ট করা অনেক সহজ এবং দক্ষ।
- Promises ব্যবহারে আপনি
done()ফাংশন ব্যবহার করে টেস্ট শেষ হওয়ার সিগন্যাল দিতে পারেন। - Async/Await ব্যবহারে কোডটি আরও পরিষ্কার হয়ে ওঠে, এবং আপনাকে
done()কল করতে হয় না, কারণ আপনি সরাসরি Promise রেজাল্টের জন্য অপেক্ষা করেন।
এগুলি অ্যাসিঙ্ক্রোনাস অপারেশনগুলির টেস্টিং সহজতর করে এবং আপনার কোডকে আরও শক্তিশালী ও নির্ভরযোগ্য করে তোলে।
JasmineJS এ clock() এবং টিমার ফাংশনগুলো ব্যবহার করে আপনি সময় সম্পর্কিত কার্যক্রম এবং অ্যাসিঙ্ক্রোনাস টেস্টিংকে আরো ভালোভাবে নিয়ন্ত্রণ করতে পারেন। এই ফাংশনগুলো মূলত টাইমার ফাংশন এবং টাইম সম্পর্কিত কোডের আচরণ পরীক্ষা করতে ব্যবহৃত হয়।
JasmineJS এ clock() ব্যবহার করে আপনি setTimeout(), setInterval(), Date() এর মতো টাইমার ফাংশনগুলোর কার্যকারিতা পরীক্ষা করতে পারেন এবং তাদের গতিকে নিয়ন্ত্রণ করতে পারেন। এতে, আপনি অ্যাসিঙ্ক্রোনাস কোডের সঠিকতা পরীক্ষা করতে সহজে সময় নিয়ন্ত্রণ করতে পারবেন।
clock() ফাংশন
JasmineJS এর clock() ফাংশনটি টাইমার এবং ডেটা সম্পর্কিত ফাংশনগুলো মক (mock) করতে এবং সময় নিয়ন্ত্রণ করতে ব্যবহৃত হয়। এটি সাধারণত setTimeout(), setInterval(), এবং Date() এর মতো ফাংশনের গতিকে সিমুলেট করতে ব্যবহৃত হয়।
clock() এর ব্যবহার
- Clock ইনস্ট্যান্স তৈরি করা:
jasmine.clock()কল করার মাধ্যমে আপনি একটি clock ইনস্ট্যান্স তৈরি করতে পারবেন। - টেস্ট চলাকালীন সময় নিয়ন্ত্রণ: এটি ব্যবহার করে আপনি টাইমার ফাংশনের সময়ের গতিকে নিয়ন্ত্রণ করতে পারেন, যেমন টাইমআউট বা ইন্টারভ্যালের সময় থামিয়ে রাখা বা এগিয়ে নিয়ে যাওয়া।
উদাহরণ:
describe("Timer Functions with Jasmine Clock", function() {
let callback;
beforeEach(function() {
// Clock এর ইনস্ট্যান্স তৈরি করা
jasmine.clock().install();
callback = jasmine.createSpy("callback"); // স্পাই তৈরি করা
});
afterEach(function() {
jasmine.clock().uninstall(); // টেস্ট শেষে clock এর ইনস্ট্যান্স আনইনস্টল করা
});
it("should call callback after timeout", function() {
setTimeout(function() {
callback();
}, 1000);
// সময়কে দ্রুত এগিয়ে নেওয়া (১০০০ মিলিসেকেন্ডের আগে)
jasmine.clock().tick(1000);
expect(callback).toHaveBeenCalled(); // কলব্যাক ফাংশনটি এক্সপেক্ট করা
});
});
এখানে:
jasmine.clock().install(): এটি clock ইনস্ট্যান্স তৈরি করে এবং টাইমার ফাংশনগুলোকে মক করে।jasmine.clock().tick(1000): এটি ১০০০ মিলিসেকেন্ড (১ সেকেন্ড) সময় এগিয়ে নিয়ে যায়, ফলেsetTimeout()দ্রুত চলে এবংcallbackফাংশন কল হয়।jasmine.clock().uninstall(): টেস্ট শেষ হলে clock ইনস্ট্যান্সটি আনইনস্টল করা হয়।
setInterval() এবং setTimeout() এর সাথে Clock
Jasmine এর clock() ব্যবহার করে আপনি setInterval() এবং setTimeout() এর টাইমিং এবং আচরণ নিয়ন্ত্রণ করতে পারেন।
setInterval() এর উদাহরণ:
describe("setInterval with Jasmine Clock", function() {
let callback;
beforeEach(function() {
jasmine.clock().install();
callback = jasmine.createSpy("callback");
});
afterEach(function() {
jasmine.clock().uninstall();
});
it("should call callback every second", function() {
setInterval(function() {
callback();
}, 1000);
jasmine.clock().tick(3000); // ৩ সেকেন্ড (৩ বার কলব্যাক হওয়া উচিত)
expect(callback.calls.count()).toBe(3); // কলব্যাক ৩ বার কল হয়েছে কিনা
});
});
এখানে:
setInterval()প্রতিটি সেকেন্ডে কলব্যাক ফাংশনটিকে চালু করে।jasmine.clock().tick(3000)এটি ৩ সেকেন্ড (৩টি ১০০০ মিলিসেকেন্ড) সময় এগিয়ে নিয়ে আসে, ফলেcallbackফাংশনটি তিনবার কল হয়।
Date() এর সাথে Clock
Jasmine এর clock() ব্যবহার করে আপনি Date() অবজেক্টের সময়ও নিয়ন্ত্রণ করতে পারেন। এইভাবে, আপনি সময় সম্পর্কিত ফাংশনগুলো পরীক্ষা করতে পারবেন যেমন, কোডের নির্দিষ্ট সময় বা তারিখে কোন কাজ করা হচ্ছে কিনা।
Date() এর উদাহরণ:
describe("Date with Jasmine Clock", function() {
let clock;
beforeEach(function() {
clock = jasmine.clock().install();
});
afterEach(function() {
clock.uninstall();
});
it("should mock Date to return a specific time", function() {
clock.mockDate(new Date(2024, 0, 1)); // ২০২৪ সালের ১ জানুয়ারি সময় সেট করা
const now = new Date();
expect(now.getFullYear()).toBe(2024);
expect(now.getMonth()).toBe(0); // জানুয়ারি মাস (০)
expect(now.getDate()).toBe(1); // ১ জানুয়ারি
});
});
এখানে:
clock.mockDate(new Date(2024, 0, 1)): এটিDate()অবজেক্টকে মক করে এবং2024-01-01দিন সময় হিসেবে সেট করে। এরপর,nowভেরিয়েবলটি তখন ২০২৪ সালের ১ জানুয়ারি হবে, যা আপনি যাচাই করতে পারেন।
সারাংশ
JasmineJS এর clock() এবং Timer Functions টাইমার ও সময় সম্পর্কিত ফাংশনগুলো নিয়ন্ত্রণ করার জন্য একটি শক্তিশালী সরঞ্জাম। এর মাধ্যমে আপনি setTimeout(), setInterval(), এবং Date() এর সময় নিয়ন্ত্রণ করতে পারেন এবং এগুলোর আচরণকে সঠিকভাবে মক বা সিমুলেট করতে পারেন।
- clock() ফাংশনটি টাইমার বা সময় সম্পর্কিত ফাংশনগুলোর গতিকে নিয়ন্ত্রণ করতে সাহায্য করে।
- jasmine.clock().install(): clock ইনস্ট্যান্স তৈরি করে।
- jasmine.clock().uninstall(): clock ইনস্ট্যান্স আনইনস্টল করে।
- jasmine.clock().tick(ms): টাইমকে নির্দিষ্ট মিলিসেকেন্ড এগিয়ে নেয়।
এই ফাংশনগুলোর মাধ্যমে আপনি অ্যাসিঙ্ক্রোনাস কোডের সঠিকতা পরীক্ষা করতে সহজে সময় নিয়ন্ত্রণ করতে পারবেন, যা টেস্টিং প্রক্রিয়াকে আরো নির্ভুল এবং কার্যকর করে তোলে।
Read more