RxJS (Reactive Extensions for JavaScript) একটি শক্তিশালী লাইব্রেরি যা অ্যাসিঙ্ক্রোনাস ডেটা এবং ইভেন্ট-ভিত্তিক প্রোগ্রামিং সহজ করে তোলে। যখন অ্যাসিঙ্ক্রোনাস ডেটা প্রক্রিয়া করা হয়, তখন Error Handling একটি গুরুত্বপূর্ণ বিষয় হয়ে দাঁড়ায়, কারণ ত্রুটি (error) ঘটতে পারে যেকোনো সময়, বিশেষত API কল বা ইউজার ইন্টারঅ্যাকশনের ক্ষেত্রে। RxJS এ error handling এর জন্য বিভিন্ন অপারেটর যেমন catchError(), retry(), এবং retryWhen() ব্যবহৃত হয়।
এছাড়া, unit testing করা RxJS কোডের জন্য খুবই গুরুত্বপূর্ণ, কারণ অ্যাসিঙ্ক্রোনাস অপারেশন এবং error handling সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা প্রয়োজন।
এই টিউটোরিয়ালে, আমরা RxJS error handling এবং unit testing এর সমন্বয় করার বিষয়টি আলোচনা করবো।
RxJS Error Handling
RxJS এর error handling অনেকটাই সিঙ্ক্রোনাস বা অ্যাসিঙ্ক্রোনাস অপারেশনগুলির জন্য প্রস্তুত। যখন কোনো Observable ত্রুটি (error) পাঠায়, তখন catchError(), retry(), retryWhen() অপারেটর ব্যবহার করে error manage করা হয়।
1. catchError() অপারেটর
catchError() অপারেটরটি ব্যবহৃত হয় যখন কোনো Observable ত্রুটি (error) দেয়, এবং সেই ত্রুটিকে ধরতে এবং সঠিকভাবে হ্যান্ডল করতে সাহায্য করে। এটি fallback value বা alternate observable রিটার্ন করতে পারে।
উদাহরণ: catchError() এর ব্যবহার
import { of, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
// একটি Observable যা error ছুড়ে দিচ্ছে
const observable = throwError('Something went wrong');
observable.pipe(
catchError(error => {
console.log('Caught error:', error);
return of('Fallback value'); // Fallback value রিটার্ন করবে
})
).subscribe(
value => console.log(value),
error => console.error(error)
);
আউটপুট:
Caught error: Something went wrong
Fallback value
এখানে, catchError() ব্যবহার করে ত্রুটি হ্যান্ডল করা হয়েছে এবং ফালব্যাক ভ্যালু রিটার্ন করা হয়েছে।
2. retry() এবং retryWhen() অপারেটর
retry() অপারেটরটি retry count নির্ধারণ করে, যা কোনো ত্রুটি ঘটলে পুনরায় চেষ্টা করবে। অন্যদিকে, retryWhen() একটি কাস্টম retry লজিক প্রদান করতে ব্যবহৃত হয়।
উদাহরণ: retry() এর ব্যবহার
import { of, throwError } from 'rxjs';
import { retry, catchError } from 'rxjs/operators';
const observable = throwError('Temporary error');
observable.pipe(
retry(3), // তিনবার পুনরায় চেষ্টা করবে
catchError(error => {
console.log('Error after retrying 3 times:', error);
return of('Failed after retries');
})
).subscribe(
value => console.log(value),
error => console.error(error)
);
আউটপুট:
Error after retrying 3 times: Temporary error
Failed after retries
এখানে, retry(3) ব্যবহৃত হয়েছে যা ত্রুটির পর তিনবার পুনরায় চেষ্টা করেছে।
RxJS Testing
RxJS কোডের unit testing করা খুবই গুরুত্বপূর্ণ, বিশেষ করে যখন আপনি অ্যাসিঙ্ক্রোনাস কোড এবং error handling নিয়ে কাজ করছেন। RxJS কোড টেস্ট করার জন্য সাধারণত Jasmine বা Jest ব্যবহৃত হয়, এবং marbles testing প্যাটার্ন ব্যবহার করা হয়। RxJS-এর TestScheduler ক্লাসটি আমাদের সাহায্য করে marbles syntax ব্যবহার করে সময় নির্ধারণ এবং ত্রুটি হ্যান্ডলিংয়ের বিভিন্ন পরিস্থিতি পরীক্ষা করতে।
1. TestScheduler দিয়ে Unit Testing
TestScheduler-এর মাধ্যমে আমরা marbles syntax ব্যবহার করে RxJS স্ট্রিমগুলির সময় এবং আউটপুট পরীক্ষা করতে পারি। এটি কোডের সময় নির্ধারণ, error handling, এবং বিভিন্ন অপারেটরের আচরণ পরীক্ষা করার জন্য কার্যকরী।
উদাহরণ: TestScheduler দিয়ে error handling টেস্ট করা
import { TestScheduler } from 'rxjs/testing';
import { throwError, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
describe('RxJS Error Handling Tests', () => {
let testScheduler: TestScheduler;
beforeEach(() => {
testScheduler = new TestScheduler((actual, expected) => {
expect(actual).toEqual(expected);
});
});
it('should handle errors correctly with catchError()', () => {
testScheduler.run(({ cold, expectObservable }) => {
const source$ = cold('-#', null, 'error');
const expected = '-a|'; // Expect fallback value
const result$ = source$.pipe(
catchError(err => {
return of('Fallback value');
})
);
expectObservable(result$).toBe(expected);
});
});
it('should retry 2 times before failing', () => {
testScheduler.run(({ cold, expectObservable }) => {
const source$ = cold('-#', null, 'error');
const expected = '-a--b--c--#';
const result$ = source$.pipe(
retry(2),
catchError(() => of('Failed after retries'))
);
expectObservable(result$).toBe(expected);
});
});
});
ব্যাখ্যা:
- TestScheduler ব্যবহার করে cold observables তৈরি করা হয়েছে, যেখানে marbles syntax ব্যবহৃত হয়েছে।
- catchError() এবং retry() অপারেটরগুলোর আচরণ টেস্ট করা হয়েছে, এবং প্রত্যাশিত আউটপুটের সাথে তুলনা করা হয়েছে।
RxJS Error Handling এবং Testing এর সমন্বয়
RxJS এর Error Handling এবং Testing এর সমন্বয় করার মাধ্যমে আপনি আপনার অ্যাসিঙ্ক্রোনাস কোডের সঠিকতা নিশ্চিত করতে পারেন। Error handling অপারেটর যেমন catchError, retry, এবং retryWhen এর মাধ্যমে আপনি কোডের বিভিন্ন error scenarios হ্যান্ডল করতে পারেন, এবং TestScheduler এর মাধ্যমে আপনি সহজে এই error handling লজিক পরীক্ষা করতে পারেন।
RxJS-এ marbles testing ব্যবহার করে আপনি ত্রুটি হ্যান্ডলিংয়ের সময়, আউটপুট এবং বিভিন্ন edge cases পরীক্ষা করতে পারেন, যা অ্যাপ্লিকেশনের stability এবং reliability নিশ্চিত করে।
সারাংশ
- RxJS Error Handling: RxJS-এ catchError(), retry(), retryWhen() এর মাধ্যমে অ্যাসিঙ্ক্রোনাস ডেটা স্ট্রিমের ত্রুটি হ্যান্ডলিং করা হয়।
- Testing with TestScheduler: TestScheduler এবং marbles syntax ব্যবহার করে আপনি RxJS স্ট্রিমগুলির সময় এবং আউটপুট পরীক্ষা করতে পারেন।
- Error Scenarios Testing: RxJS কোডে বিভিন্ন ত্রুটি এবং retry লজিকের সঠিকতা পরীক্ষার জন্য unit tests তৈরি করা গুরুত্বপূর্ণ।
RxJS এবং Angular-এ error handling এবং testing সমন্বয় করে অ্যাসিঙ্ক্রোনাস কোডের স্থিতিশীলতা এবং কার্যক্ষমতা নিশ্চিত করা যায়।
Read more