RxJS (Reactive Extensions for JavaScript) এর শক্তিশালী টুলগুলির মধ্যে একটি হল TestScheduler, যা বিশেষভাবে RxJS স্ট্রিমের testing এবং timing নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয়। TestScheduler ব্যবহার করে আপনি Observables-এর টাইমিং এবং আউটপুট ঠিকমত পরীক্ষা করতে পারেন, যা সাধারণত অ্যাসিঙ্ক্রোনাস এবং টাইম-ডিপেনডেন্ট অপারেশনগুলির জন্য খুবই প্রয়োজনীয়।
RxJS-এ TestScheduler হচ্ছে একটি টেস্টিং টুল যা আপনাকে virtual time এর উপর ভিত্তি করে পরীক্ষার "time-based" আচরণ সিমুলেট করতে সাহায্য করে। এটি marble diagrams এর সাহায্যে Observables পরীক্ষা করে এবং টাইমিং, ইভেন্ট সিকোয়েন্স, এবং স্ট্রিমগুলির মধ্যে সম্পর্ক যাচাই করতে সহায়ক হয়।
TestScheduler কী?
TestScheduler RxJS এর একটি বিশেষ উপাদান যা timing এবং virtual time এর মধ্যে testing করার সুবিধা দেয়। এটি নির্দিষ্ট timeframes তৈরি করতে এবং next(), error(), এবং complete() ইভেন্টগুলির ওপর কাজ করে অ্যাসিঙ্ক্রোনাস স্ট্রিমগুলি সঠিকভাবে পরীক্ষা করতে সহায়তা করে। আপনি যখন TestScheduler ব্যবহার করেন, তখন আপনি "virtual time" তৈরি করতে পারেন এবং স্ট্রিমের মধ্যে নির্দিষ্ট সময়ের মধ্যে ঘটিত ঘটনাগুলি সিমুলেট করতে পারেন।
TestScheduler সাধারণত Jasmine, Karma, বা Jest এর মতো টেস্টিং ফ্রেমওয়ার্কের সাথে ব্যবহৃত হয়।
TestScheduler এর বৈশিষ্ট্য
- Virtual Time: TestScheduler আপনাকে virtual time দিয়ে কাজ করতে দেয়, যা প্রকৃত সময়ের উপর নির্ভর না করে কেবল সময়ের সিমুলেশন চালায়।
- Marble Diagrams: এটি marble diagrams এর মাধ্যমে পরীক্ষার ফলাফল বুঝতে সহজ করে তোলে, যেখানে আপনি
--(টাইম গ্যাপ),-(টিক), এবং|(complete) চিহ্ন ব্যবহার করে স্ট্রিমের আচরণ সিমুলেট করেন। - Testing Time-Dependent Logic: অ্যাসিঙ্ক্রোনাস স্ট্রিম এবং টাইম-ডিপেনডেন্ট লজিক পরীক্ষা করার জন্য এটি উপকারী।
TestScheduler ব্যবহার করার জন্য সাধারণ ধাপ
TestScheduler ইনস্টল করা:
আপনি প্রথমেrxjsপ্যাকেজ থেকেTestSchedulerআমদানি করবেন।import { TestScheduler } from 'rxjs/testing';TestScheduler তৈরি করা:
টেস্টের ভিতরে TestScheduler ইনস্ট্যান্স তৈরি করুন।const scheduler = new TestScheduler((actual, expected) => { expect(actual).toEqual(expected); });- TestScheduler এ observables পরীক্ষা করা:
marble diagram এর মাধ্যমে আপনি আপনার observable স্ট্রিমকে সিমুলেট করতে পারেন এবং সেই অনুযায়ী টাইমিং এবং আউটপুট পরীক্ষা করতে পারেন।
TestScheduler দিয়ে Observable Testing এর উদাহরণ
উদাহরণ ১: Basic Observable Testing
import { TestScheduler } from 'rxjs/testing';
import { of } from 'rxjs';
describe('RxJS TestScheduler Example', () => {
it('should emit values synchronously', () => {
const scheduler = new TestScheduler((actual, expected) => {
expect(actual).toEqual(expected);
});
scheduler.run(({ cold, expectObservable }) => {
const source = cold('-a-b-c-|'); // Marble diagram
const expected = '-a-b-c-|'; // Expected output
expectObservable(source).toBe(expected);
});
});
});
এখানে, cold ফাংশনটি একটি cold Observable তৈরি করে এবং আমরা এর মাধ্যমে নির্দিষ্ট টাইম ফ্রেমে মানগুলি পাঠাতে সিমুলেট করেছি। expectObservable() এর মাধ্যমে স্ট্রিমের আচরণ এবং সময়ের সাথে মান যাচাই করা হয়েছে।
Marble diagram:
--a-b-c-|
এখানে - হলো time gap, a, b, এবং c হলো emitted values, এবং | হলো Observable এর complete ইভেন্ট।
উদাহরণ ২: Testing Observables with Time Delays
import { TestScheduler } from 'rxjs/testing';
import { of } from 'rxjs';
import { delay } from 'rxjs/operators';
describe('TestScheduler with delays', () => {
it('should delay emitted values by 2 frames', () => {
const scheduler = new TestScheduler((actual, expected) => {
expect(actual).toEqual(expected);
});
scheduler.run(({ cold, expectObservable }) => {
const source = cold('a-b-c-|').pipe(delay(2, scheduler)); // Apply a 2-frame delay
const expected = ' --a--b--c-|'; // Delayed output
expectObservable(source).toBe(expected);
});
});
});
এখানে, delay(2, scheduler) দ্বারা আমরা 2 time frames পর মানগুলো পাঠানোর জন্য একটি বিলম্ব প্রয়োগ করেছি।
Marble diagram:
--a--b--c-|
ব্যাখ্যা: এখানে, প্রথম মানটি 2 time unit পরে আসবে এবং b এবং c মানগুলোও বিলম্বিত হবে।
TestScheduler দিয়ে Error Handling Testing
TestScheduler ব্যবহার করে আপনি error handling-ও পরীক্ষা করতে পারেন। যখন কোনো observable error হ্যান্ডল করে, তখন আপনি সেই error পরিস্থিতি কিভাবে প্রক্রিয়া হবে তা পরীক্ষায় দেখতে পারেন।
import { TestScheduler } from 'rxjs/testing';
import { throwError } from 'rxjs';
describe('TestScheduler with Error Handling', () => {
it('should throw an error', () => {
const scheduler = new TestScheduler((actual, expected) => {
expect(actual).toEqual(expected);
});
scheduler.run(({ cold, expectObservable }) => {
const source = cold('#'); // Marble diagram representing an error
const expected = '#'; // Expected output is error
expectObservable(source).toBe(expected);
});
});
});
এখানে, # দিয়ে আমরা একটি error stream সিমুলেট করেছি, এবং TestScheduler সেটি সঠিকভাবে পরীক্ষা করছে।
TestScheduler এর সুবিধা
- Precise Timing:
আপনি marble diagrams ব্যবহার করে টাইমিং নির্ধারণ এবং সঠিক সময়ে Observables এর মান পরীক্ষা করতে পারেন। এটি অ্যাসিঙ্ক্রোনাস স্ট্রিমের সাথে কাজ করার জন্য উপকারী। - Easy Debugging:
এটি testing এর সময় event flow ট্র্যাক করতে সাহায্য করে, বিশেষত যখন আপনি টাইম-ডিপেনডেন্ট লজিক বা স্ট্রিমের সময়ের সাথে সম্পর্কিত কাজ করছেন। - Simulating Time-based Events:
TestScheduler আপনাকে এমনকি সময় সম্পর্কিত বা ডিলে হওয়া ইভেন্টগুলি সিমুলেট করতে দেয়, যা বাস্তবে সময়মতো পরীক্ষা করা কঠিন। - Unit Testing:
অ্যাসিঙ্ক্রোনাস এবং টাইম-ডিপেনডেন্ট কোডগুলির জন্য TestScheduler খুবই কার্যকরী। এটি আপনাকে ইউনিট টেস্টিং এর মাধ্যমে স্ট্রিমের আচরণ পরীক্ষা করতে সহায়তা করে।
সারাংশ
RxJS এর TestScheduler একটি অত্যন্ত শক্তিশালী টুল যা আপনি আপনার Observables এর টেস্টিং এর জন্য ব্যবহার করতে পারেন। এটি marble diagrams এর মাধ্যমে টাইমিং এবং সিকোয়েন্সের সাথে স্ট্রিম পরীক্ষা করার সুবিধা দেয়, যার মাধ্যমে আপনি সহজেই asynchronous স্ট্রিম, time-dependent logic, এবং error handling পরীক্ষা করতে পারবেন। RxJS এর TestScheduler আপনার কোডের reliability এবং correctness নিশ্চিত করার জন্য একটি অপরিহার্য টুল।
Read more