Lodash একটি শক্তিশালী লাইব্রেরি যা ডেটা ম্যানিপুলেশন এবং অন্যান্য ফাংশনাল অপারেশনগুলো সহজ করে দেয়, তবে কখনও কখনও কিছু edge cases (প্রান্তিক কেস) এবং error handling গুরুত্বপূর্ণ হয়ে ওঠে। এই ধরনের পরিস্থিতিতে ফাংশনগুলির সঠিকভাবে কাজ করছে কিনা তা যাচাই করা গুরুত্বপূর্ণ। Lodash এর সাথে কাজ করার সময় unit tests এবং edge case handling নিয়ে চিন্তা করা উচিত।
এখানে আলোচনা করা হবে কীভাবে Lodash ব্যবহার করে edge cases এবং error handling এর জন্য টেস্ট লেখা যায়।
১. Jest টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করা
Jest একটি জনপ্রিয় JavaScript টেস্টিং ফ্রেমওয়ার্ক, যা unit testing এবং edge case সনাক্ত করতে সহায়তা করে। Lodash এর ফাংশনগুলোর টেস্ট লেখার জন্য Jest ব্যবহার করতে পারেন।
Jest ইনস্টল করা
প্রথমে, Jest ইনস্টল করতে হবে:
npm install --save-dev jest
এছাড়া, যদি আপনি ES6 modules ব্যবহার করেন, তাহলে babel-jest ইনস্টল করতে হতে পারে।
npm install --save-dev babel-jest @babel/core @babel/preset-env
২. Lodash এর Edge Cases টেস্ট করা
এখন আমরা Lodash এর কিছু সাধারণ ফাংশনের টেস্টিং কেস লিখব, বিশেষত edge cases এবং error handling।
এ. _.get() ফাংশনের Edge Case
_.get() ফাংশনটি অবজেক্ট বা অ্যারে থেকে নির্দিষ্ট প্রোপার্টি বা ভ্যালু অ্যাক্সেস করতে ব্যবহার করা হয়। আমরা যাচাই করব যে, এটি অব্যবহৃত বা undefined প্রোপার্টি অ্যাক্সেসের সময় সঠিকভাবে ডিফল্ট ভ্যালু রিটার্ন করে কিনা।
উদাহরণ: _.get() এর জন্য টেস্ট লেখা
import _ from 'lodash';
describe('_.get() Edge Cases', () => {
it('should return the default value when accessing undefined property', () => {
const object = { name: 'Alice' };
const result = _.get(object, 'address', 'Unknown Address');
expect(result).toBe('Unknown Address'); // Expected default value
});
it('should return undefined for non-existent properties if no default value is provided', () => {
const object = { name: 'Bob' };
const result = _.get(object, 'address');
expect(result).toBeUndefined(); // Should return undefined
});
it('should correctly access nested properties', () => {
const object = { user: { name: 'Charlie', age: 30 } };
const result = _.get(object, 'user.name');
expect(result).toBe('Charlie'); // Should correctly access the nested value
});
});
এখানে, আমরা _.get() ফাংশনটির জন্য তিনটি edge case পরীক্ষা করেছি:
- undefined প্রোপার্টি: যদি প্রোপার্টি না থাকে তবে এটি ডিফল্ট মান রিটার্ন করবে।
- অব্যবহৃত প্রোপার্টি: কোনো প্রোপার্টি না থাকলে এটি
undefinedরিটার্ন করবে। - nested প্রোপার্টি: এটি সঠিকভাবে nested প্রোপার্টি অ্যাক্সেস করবে।
৩. _.set() ফাংশনের Error Handling
_.set() ফাংশনটি অবজেক্টে একটি নতুন প্রোপার্টি সেট করতে ব্যবহৃত হয়। এর জন্য টেস্ট লিখতে হলে আমাদের চেক করতে হবে যে এটি সঠিকভাবে ডেটা ম্যানিপুলেট করছে এবং কোনো ভুল প্রোপার্টি বা type error রিসিভ করছে কিনা।
উদাহরণ: _.set() এর জন্য টেস্ট লেখা
import _ from 'lodash';
describe('_.set() Error Handling', () => {
it('should set a property correctly on a simple object', () => {
const object = {};
_.set(object, 'user.name', 'Alice');
expect(object.user.name).toBe('Alice');
});
it('should handle non-existent objects and create nested properties', () => {
const object = {};
_.set(object, 'user.address.city', 'New York');
expect(object.user.address.city).toBe('New York');
});
it('should handle invalid path gracefully', () => {
const object = {};
_.set(object, 'user.name', 'Bob');
expect(object.user.name).toBe('Bob');
// Trying to set an invalid path (e.g. array key) should not crash
_.set(object, 'user[invalidPath].value', 'test');
expect(object.user[invalidPath]?.value).toBe('test'); // Should not throw error
});
});
এখানে, আমরা _.set() ফাংশনের তিনটি টেস্ট কেস লিখেছি:
- একটি সাধারণ অবজেক্টে প্রোপার্টি সেট করা।
- নেস্টেড প্রোপার্টি সেট করা, যেখানে অবজেক্টটি প্রথমে তৈরি হয়নি।
- অবৈধ পাথ ব্যবহার করা, যা ভুল প্রোপার্টি বা অবৈধ অ্যারে ইনডেক্স ব্যবহার করতে পারে।
৪. _.cloneDeep() ফাংশনের Edge Case
_.cloneDeep() একটি গভীর কপি তৈরি করে, কিন্তু কখনও কখনও আপনি যদি এর সাথে সঠিক টাইপ বা ইনপুট ডেটার প্রকার যাচাই না করেন, তবে এটি infinite loops বা stack overflow ঘটাতে পারে। তাই আমরা নিশ্চিত করব যে এটি circular references (যেমন অবজেক্টের মধ্যে নিজেকে রেফারেন্স করা) এবং nested structures সঠিকভাবে কপি করছে।
উদাহরণ: _.cloneDeep() এর জন্য টেস্ট লেখা
import _ from 'lodash';
describe('_.cloneDeep() Edge Cases', () => {
it('should clone an object deeply without affecting the original object', () => {
const object = { name: 'Alice', age: 25 };
const clonedObject = _.cloneDeep(object);
clonedObject.name = 'Bob';
expect(object.name).toBe('Alice');
expect(clonedObject.name).toBe('Bob');
});
it('should handle circular references safely', () => {
const object = {};
object.self = object; // circular reference
const clonedObject = _.cloneDeep(object);
expect(clonedObject).toEqual(object); // Should not throw an error
expect(clonedObject.self).toEqual(clonedObject);
});
it('should correctly clone nested objects', () => {
const object = { user: { name: 'Charlie', details: { age: 30 } } };
const clonedObject = _.cloneDeep(object);
clonedObject.user.details.age = 35;
expect(object.user.details.age).toBe(30);
expect(clonedObject.user.details.age).toBe(35);
});
});
এখানে, _.cloneDeep() এর জন্য তিনটি টেস্ট কেস লিখেছি:
- একটি সাধারণ অবজেক্টের কপি তৈরি করা।
- Circular reference (যেখানে একটি অবজেক্ট নিজেকে রেফারেন্স করে) সঠিকভাবে কপি করা।
- Nested objects (যেখানে অবজেক্টের ভিতরে অবজেক্ট থাকে) কপি করা।
৫. Error Handling Best Practices
- Invalid Inputs: সকল ফাংশন কলের আগে ইনপুট যাচাই করা উচিত। Lodash এর
_.isEmpty(),_.isObject(),_.isArray()ফাংশন ব্যবহার করে ইনপুট ভ্যালিডেশন নিশ্চিত করা যেতে পারে। - Graceful Error Handling: কোডে কোনো ভুল বা ব্যতিক্রম (exception) ঘটলে, এটি সুন্দরভাবে হ্যান্ডেল করুন। Lodash এর
_.attempt()ফাংশনটি কোনো ফাংশন কলের সময় ঘটে যাওয়া ত্রুটি ধরা এবং হ্যান্ডেল করতে ব্যবহৃত হয়।
const _ = require('lodash');
let result = _.attempt(() => {
// Some operation that might throw an error
return JSON.parse("invalid JSON");
});
if (_.isError(result)) {
console.log("An error occurred:", result.message);
}
এখানে, _.attempt() ব্যবহার করে কোনো ফাংশন কলের সময় error handling করা হয়েছে।
উপসংহার
Lodash এর ফাংশনগুলি অনেক শক্তিশালী এবং সঠিকভাবে ব্যবহার করলে কোড আরও কার্যকরী এবং রক্ষণাবেক্ষণযোগ্য হয়ে ওঠে। তবে, edge cases এবং error handling নিশ্চিত করার জন্য সঠিক টেস্ট লেখা অত্যন্ত গুরুত্বপূর্ণ। Jest এর মতো টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করে Lodash এর ফাংশনগুলোর কার্যকারিতা পরীক্ষা করে আপনি সঠিকভাবে validation, error handling, এবং edge case সনাক্ত করতে পারবেন।
Read more