RxJS (Reactive Extensions for JavaScript) একটি শক্তিশালী লাইব্রেরি যা অ্যাসিঙ্ক্রোনাস ডেটা স্ট্রিম এবং ইভেন্ট হ্যান্ডলিং সহজ করে তোলে। যখন আপনি RxJS ব্যবহার করে একটি অ্যাপ্লিকেশন তৈরি করেন, তখন আপনার কোডের কার্যকারিতা নিশ্চিত করার জন্য Unit Testing খুবই গুরুত্বপূর্ণ। Unit testing এমন একটি প্রক্রিয়া যেখানে কোডের ছোট ছোট অংশ (ফাংশন বা মেথড) এককভাবে পরীক্ষা করা হয়, যাতে কোডটি সঠিকভাবে কাজ করছে কিনা নিশ্চিত করা যায়।
RxJS-এর জন্য unit testing লেখার জন্য Jasmine এবং Karma জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক। এই টিউটোরিয়ালে আমরা দেখব কিভাবে RxJS স্ট্রিমের জন্য unit test লেখা যায় এবং কিভাবে RxJS TestScheduler ব্যবহার করে টেস্ট করা যায়।
1. RxJS TestScheduler এর পরিচিতি
TestScheduler হল RxJS-এর একটি টেস্টিং টুল, যা অ্যাসিঙ্ক্রোনাস কোড টেস্ট করতে সহায়তা করে। এটি time-based testing এর জন্য ব্যবহৃত হয়, যেখানে আপনি টেস্টের সময় নির্ধারণ করতে পারেন এবং কোডের বিভিন্ন ইভেন্টের সময়সূচী দেখতে পারেন।
TestScheduler এর বৈশিষ্ট্য:
- Time-based Testing: এটি সময় নির্ধারণ করে, যাতে আপনি নির্দিষ্ট সময়ে স্ট্রিমের পরিবর্তন পরীক্ষা করতে পারেন।
- Marble Diagrams: এটি স্ট্রিমের মান এবং সময় সূচী পরীক্ষা করতে marble diagrams ব্যবহার করে, যেখানে আপনি একটি টেস্টের মধ্যে ডেটার প্রবাহ দেখতে পারেন।
2. Unit Testing এর জন্য RxJS স্ট্রিমের টেস্ট লেখা
উদাহরণ: RxJS স্ট্রিমের জন্য Unit Test লেখা
ধরা যাক, আমাদের একটি RxJS স্ট্রিম রয়েছে যা একটি ডেটা ফিল্টার করবে। আমরা এটি টেস্ট করব যাতে নিশ্চিত হওয়া যায় যে ফিল্টারিং সঠিকভাবে কাজ করছে।
Code Example: Filtering Stream
import { of } from 'rxjs';
import { filter } from 'rxjs/operators';
export function getEvenNumbers(numbers: number[]) {
return of(...numbers).pipe(
filter((number) => number % 2 === 0)
);
}
এখানে, getEvenNumbers একটি অ্যারে থেকে even numbers ফিল্টার করছে এবং Observable রিটার্ন করছে।
Unit Test Example: Testing the getEvenNumbers function
import { getEvenNumbers } from './path-to-your-function';
import { TestScheduler } from 'rxjs/testing';
describe('RxJS Unit Tests', () => {
let testScheduler: TestScheduler;
beforeEach(() => {
// Create an instance of TestScheduler
testScheduler = new TestScheduler((actual, expected) => {
expect(actual).toEqual(expected);
});
});
it('should filter even numbers from an array', () => {
testScheduler.run(({ cold, expectObservable }) => {
const numbers = [1, 2, 3, 4, 5, 6];
const expected = ' a b c d '; // expected emissions timeline
// cold() creates an observable that emits values
const source = cold(' a b c d ', { a: 1, b: 2, c: 3, d: 4 });
const result = getEvenNumbers(numbers);
// Check if the emitted values match the expected output
expectObservable(result).toBe(expected, { a: 2, b: 4 });
});
});
});
ব্যাখ্যা:
TestSchedulerব্যবহার করা হয়েছে, যাতে আমরা টেস্টের সময় সূচী নির্ধারণ করতে পারি।cold()ব্যবহার করে আমরা একটি observable স্ট্রিম তৈরি করেছি, যা আমাদের নির্দিষ্ট মান এবং সময়সূচী অনুযায়ী ডেটা পাঠাবে।expectObservable()ব্যবহার করে, আমরা চেক করেছি যে আউটপুট স্ট্রিম সঠিকভাবে even numbers (২ এবং ৪) ফিল্টার করে রিটার্ন করেছে।
3. Marble Diagrams দিয়ে RxJS Unit Testing
Marble Diagrams হল একটি খুব শক্তিশালী কনসেপ্ট, যেখানে আপনি Observable এর স্ট্রিম এবং তার মানগুলোর প্রবাহ চিত্রিত করতে পারেন। TestScheduler-এ মার্বল ডায়াগ্রাম ব্যবহার করে আপনি RxJS স্ট্রিমের কার্যকারিতা পরীক্ষার সময় দৃশ্যমানভাবে ডেটার ফ্লো দেখাতে পারেন।
উদাহরণ: Marble Diagrams ব্যবহার করে Unit Testing
import { TestScheduler } from 'rxjs/testing';
import { map } from 'rxjs/operators';
describe('RxJS Marble Diagram Testing', () => {
let testScheduler: TestScheduler;
beforeEach(() => {
testScheduler = new TestScheduler((actual, expected) => {
expect(actual).toEqual(expected);
});
});
it('should map each value to its square', () => {
testScheduler.run(({ cold, expectObservable }) => {
const input = cold(' -a-b-c-| ', { a: 1, b: 2, c: 3 });
const expected = ' -x-y-z-| ';
const result = input.pipe(map((x: number) => x * x));
expectObservable(result).toBe(expected, { x: 1, y: 4, z: 9 });
});
});
});
ব্যাখ্যা:
- Marble diagram ব্যবহার করে আমরা cold observable তৈরি করেছি, যেখানে
-a-b-c-|মানের সময়সূচী এবং এর মানগুলি{ a: 1, b: 2, c: 3 }। map()অপারেটরের মাধ্যমে আমরা প্রতিটি মানকে স্কয়ারে পরিবর্তন করেছি এবং তারপরেexpectObservable()দ্বারা আমরা পরীক্ষার জন্য সময়সূচী এবং ফলাফল যাচাই করেছি।
4. Unsubscribing এবং Memory Leaks প্রতিরোধ করা
RxJS এর স্ট্রিমগুলির সাথে কাজ করার সময় unsubscribe করা অত্যন্ত গুরুত্বপূর্ণ, বিশেষত Angular অ্যাপ্লিকেশনগুলোতে। স্ট্রিম যদি অব্যাহত থাকে তবে তা মেমরি লিকের কারণ হতে পারে, যা অ্যাপ্লিকেশনের পারফরম্যান্সের জন্য ক্ষতিকর।
উদাহরণ: Unsubscribe করার পদ্ধতি
import { Component, OnDestroy } from '@angular/core';
import { Observable, Subscription } from 'rxjs';
@Component({
selector: 'app-unsubscribe-example',
templateUrl: './unsubscribe-example.component.html',
})
export class UnsubscribeExampleComponent implements OnDestroy {
private subscription: Subscription;
ngOnInit() {
const observable = new Observable(observer => {
observer.next('Hello');
observer.complete();
});
// Subscribe to the observable
this.subscription = observable.subscribe({
next: value => console.log(value),
complete: () => console.log('Completed!')
});
}
ngOnDestroy() {
// Unsubscribe to prevent memory leaks
if (this.subscription) {
this.subscription.unsubscribe();
}
}
}
ব্যাখ্যা:
ngOnDestroy()মেথডে unsubscribe() ব্যবহার করা হয়েছে, যাতে মেমরি লিক প্রতিরোধ করা যায়। যখন Angular কম্পোনেন্টটি ধ্বংস হয়, তখন অবজার্ভেবল থেকে সাবস্ক্রাইবারকে আনসাবস্ক্রাইব করা হয়।
সারাংশ
RxJS এর জন্য unit testing লেখার মাধ্যমে আপনি আপনার অ্যাসিঙ্ক্রোনাস কোড এবং স্ট্রিমগুলির কার্যকারিতা নিশ্চিত করতে পারেন। TestScheduler এবং marble diagrams ব্যবহার করে আপনি time-based testing এবং observable flows পরীক্ষা করতে পারেন। এর মাধ্যমে আপনি নিশ্চিত করতে পারবেন যে আপনার RxJS কোড সঠিকভাবে কাজ করছে এবং ভুল প্রবাহ বা ফলাফল প্রতিরোধ করা যাচ্ছে।
- TestScheduler: Time-based testing এবং marble diagrams এর মাধ্যমে কোডের সঠিকতা পরীক্ষা করা যায়।
- unsubscribe: স্ট্রিমগুলির অব্যাহত থেকে মেমরি লিক প্রতিরোধ করতে
unsubscribe()করা জরুরি। - map(), catchError(), retry(): RxJS অপারেটরগুলি ব্যবহার করে অ্যাসিঙ্ক্রোনাস কোড এবং ডেটা স্ট্রিম ট্রান্সফর্ম করা যায়।
RxJS-এর জন্য unit testing লিখে আপনি আপনার অ্যাসিঙ্ক্রোনাস কোডের কাজ নিশ্চিত করতে পারবেন এবং কোডের স্থিতিশীলতা ও পারফরম্যান্স উন্নত করতে পারবেন।
Read more