TypeORM এর সাথে Unit Testing এবং Integration Testing
TypeORM একটি শক্তিশালী ORM (Object-Relational Mapping) লাইব্রেরি যা ডেটাবেস ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। যখন আমরা TypeORM ভিত্তিক অ্যাপ্লিকেশন তৈরি করি, তখন আমাদের অ্যাপ্লিকেশনের বিভিন্ন অংশের জন্য Unit Testing এবং Integration Testing করতে হয়। Jest এবং Mocha হল সবচেয়ে জনপ্রিয় testing frameworks যা TypeORM এর সাথে ব্যবহৃত হতে পারে।
Testing frameworks ব্যবহার করে, আপনি আপনার কোডের বৈধতা নিশ্চিত করতে পারেন এবং কোনো পরিবর্তন করার সময় আগের কাজগুলো ঠিক আছে কিনা তা যাচাই করতে পারবেন। Jest এবং Mocha উভয়ই JavaScript Testing Framework যা TypeORM সহ ব্যবহার করা যায়।
১. Jest Setup এবং TypeORM Testing
Jest একটি ফাস্ট এবং সহজ testing framework, যা কোডিংয়ের সময় পারফরম্যান্স এবং উন্নত পরীক্ষার সুবিধা প্রদান করে। TypeORM সহ Jest ব্যবহার করার জন্য, আপনাকে কিছু নির্দিষ্ট কনফিগারেশন এবং সেটআপ করতে হবে।
১.১ Jest ইনস্টলেশন এবং সেটআপ
- Jest এবং TypeORM-এর জন্য প্রয়োজনীয় প্যাকেজ ইনস্টল করুন:
npm install --save-dev jest ts-jest @types/jest
npm install typeorm reflect-metadata mysql2
- Jest কনফিগারেশন ফাইল তৈরি করুন:
jest.config.js নামক একটি ফাইল তৈরি করুন এবং নিচের কনফিগারেশন সেট করুন:
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
globalSetup: './global-setup.js', // Global setup if needed
setupFilesAfterEnv: ['./jest.setup.ts'], // Custom setup if needed
};
- TypeORM টেস্ট সেটআপ (in-memory ডেটাবেস ব্যবহার):
TypeORM এ Unit Testing করতে হলে একটি ইন-মেমরি ডেটাবেস (যেমন SQLite) ব্যবহার করা সুবিধাজনক। আপনি SQLite ব্যবহার করতে পারেন যেটি টেস্ট চলাকালীন খুব দ্রুত চালু এবং বন্ধ করা যায়।
jest.setup.ts ফাইল তৈরি করুন এবং TypeORM কনফিগারেশন সেট করুন:
import "reflect-metadata";
import { createConnection } from "typeorm";
// Use an in-memory SQLite database for testing
createConnection({
type: "sqlite",
database: ":memory:",
synchronize: true,
entities: [/* Your entities here */],
dropSchema: true, // To drop schema before each test
}).then(() => {
console.log('Test database connected');
}).catch(error => console.log("Error: ", error));
- Unit Test উদাহরণ:
এখন আপনি সহজে TypeORM এর Entity নিয়ে Unit Testing শুরু করতে পারেন। ধরুন, আপনার একটি User Entity রয়েছে, যা name এবং email ফিল্ড নিয়ে কাজ করে।
import { User } from './User'; // Import your User entity
import { getRepository } from 'typeorm';
describe('User entity', () => {
it('should save a user', async () => {
const userRepository = getRepository(User);
const user = new User();
user.name = 'John Doe';
user.email = 'john.doe@example.com';
await userRepository.save(user);
const savedUser = await userRepository.findOne({ where: { name: 'John Doe' } });
expect(savedUser).toBeDefined();
expect(savedUser.name).toBe('John Doe');
});
});
এখানে, TypeORM এর getRepository() ব্যবহার করে একটি নতুন User তৈরি করা হয়েছে এবং সেটি ডেটাবেসে সেভ করা হয়েছে। তারপর, findOne() ব্যবহার করে সেভ করা ইউজারটি খুঁজে বের করা হয়েছে এবং তার নাম যাচাই করা হয়েছে।
২. Mocha Setup এবং TypeORM Testing
Mocha আরেকটি জনপ্রিয় Testing Framework যা TypeORM সহ ব্যবহৃত হতে পারে। Mocha সাধারণত async/await এবং done পদ্ধতি ব্যবহার করে টেস্ট করে থাকে।
২.১ Mocha ইনস্টলেশন এবং সেটআপ
- Mocha এবং প্রয়োজনীয় প্যাকেজ ইনস্টল করুন:
npm install --save-dev mocha chai ts-node @types/mocha @types/chai
npm install typeorm reflect-metadata mysql2
- Mocha টেস্ট কনফিগারেশন:
Mocha টেস্ট চালানোর জন্য একটি test স্ক্রিপ্ট তৈরি করুন:
{
"scripts": {
"test": "mocha -r ts-node/register tests/**/*.test.ts"
}
}
এখানে, ts-node/register ব্যবহার করা হয়েছে যাতে TypeScript ফাইলগুলো সরাসরি Mocha দিয়ে চালানো যায়।
- TypeORM টেস্ট সেটআপ:
Mocha-এর মতো, TypeORM এর জন্যও ইন-মেমরি SQLite ডেটাবেস ব্যবহার করা যেতে পারে।
import "reflect-metadata";
import { createConnection } from "typeorm";
createConnection({
type: "sqlite",
database: ":memory:",
synchronize: true,
entities: [/* Your entities here */],
dropSchema: true,
}).then(() => {
console.log('Connected to in-memory database');
}).catch(error => console.log('Error: ', error));
- Mocha টেস্ট উদাহরণ:
import { expect } from 'chai';
import { User } from './User'; // Import your User entity
import { getRepository } from 'typeorm';
describe('User entity', () => {
it('should create and retrieve a user', async () => {
const userRepository = getRepository(User);
const user = new User();
user.name = 'Jane Doe';
user.email = 'jane.doe@example.com';
await userRepository.save(user);
const savedUser = await userRepository.findOne({ where: { name: 'Jane Doe' } });
expect(savedUser).to.not.be.null;
expect(savedUser.name).to.equal('Jane Doe');
});
});
এখানে, Mocha ব্যবহার করে User Entity এর CRUD অপারেশন টেস্ট করা হয়েছে। chai এর expect ফাংশন ব্যবহার করে টেস্ট আউটপুট যাচাই করা হয়েছে।
৩. Mocking এবং Dependency Injection
কিছু ক্ষেত্রে, TypeORM ব্যবহার করার সময় টেস্টের জন্য ডেটাবেস সংযোগ এবং অ্যাক্সেস মক করতে হতে পারে। এই জন্য Mocking এবং Dependency Injection টেকনিক ব্যবহার করা হয়।
Mocking Example:
sinon বা jest.mock() এর মাধ্যমে TypeORM এর Repository মক করা যেতে পারে।
import sinon from 'sinon';
import { getRepository } from 'typeorm';
import { User } from './User';
describe('User repository', () => {
it('should mock the repository', async () => {
const userRepositoryMock = sinon.stub(getRepository(User), 'findOne').resolves({ name: 'Mocked User' });
const user = await getRepository(User).findOne();
expect(user.name).toBe('Mocked User');
userRepositoryMock.restore(); // Restore the original method
});
});
এখানে, sinon.stub() ব্যবহার করে getRepository(User) এর findOne মেথড মক করা হয়েছে।
সারাংশ
Jest এবং Mocha হল দুটি জনপ্রিয় Testing Framework যা TypeORM এর সাথে ব্যবহৃত হতে পারে। Jest সাধারণত দ্রুত এবং সহজ টেস্টিংয়ের জন্য ব্যবহৃত হয়, যখন Mocha টেস্টিংয়ের জন্য আরও ফ্লেক্সিবিলিটি প্রদান করে। TypeORM এর সাথে Unit Testing এবং Integration Testing কার্যকরীভাবে পরিচালনা করতে, আপনি ইন-মেমরি ডেটাবেস, Repository Pattern, এবং কাস্টম কুয়েরি ব্যবহার করতে পারেন। Mocking এবং Dependency Injection এর মাধ্যমে আপনি ডেটাবেস অপারেশনগুলোকে মক করে টেস্টিং আরও সহজ করতে পারবেন।
Read more