Mocking এবং Dependency Injection ব্যবহার করা

Testing এবং Debugging TypeORM অ্যাপ্লিকেশন - টাইপওআরএম (TypeORM) - Web Development

291

Mocking এবং Dependency Injection (DI): একটি পরিচিতি

Mocking এবং Dependency Injection (DI) হল টেস্টিং এবং সফটওয়্যার ডেভেলপমেন্টের গুরুত্বপূর্ণ ধারণা যা কোডের টেস্টিং এবং রিইউজেবিলিটি উন্নত করতে সহায়তা করে।

  • Mocking হল একটি টেস্টিং কৌশল যেখানে ডিপেনডেন্সি বা এক্সটার্নাল সিস্টেমগুলোকে ভুয়া বা "mock" অবজেক্ট দিয়ে প্রতিস্থাপন করা হয়, যাতে টেস্ট চলাকালে প্রকৃত সিস্টেম বা ডেটার উপর নির্ভর না করে টেস্ট করা যায়।
  • Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যা কোডের বিভিন্ন অংশের মধ্যে ডিপেনডেন্সি (যেমন সার্ভিস, ডেটাবেস কনেকশন) ইনজেক্ট করে। এটি কোডের মডুলারিটি এবং টেস্টেবিলিটি উন্নত করে।

TypeORM-এ Mocking এবং Dependency Injection ব্যবহার করে ডেটাবেস অপারেশন বা সার্ভিস লজিকের জন্য ইউনিট টেস্ট এবং ইন্টিগ্রেশন টেস্ট তৈরি করা হয়।


TypeORM এর জন্য Mocking এবং Dependency Injection

১. Mocking TypeORM

TypeORM এর সাথে টেস্টিং করার সময় ডেটাবেসের সাথে ইন্টারঅ্যাক্ট না করে কেবলমাত্র লজিকের টেস্টিং করার জন্য Mocking ব্যবহৃত হয়। এর মাধ্যমে TypeORM এর Repository, EntityManager, অথবা QueryBuilder ইত্যাদি মক করা যেতে পারে।

Mocking TypeORM Repository:

প্রথমে jest বা অন্য কোনো টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করে TypeORM এর Repository মক করা হবে। jest একটি জনপ্রিয় টেস্টিং লাইব্রেরি যা mocking সহজে পরিচালনা করতে সাহায্য করে।

Example: Mocking TypeORM Repository using Jest

import { getRepository } from "typeorm";
import { User } from "./entity/User";

// Mocking the repository
jest.mock("typeorm", () => ({
  getRepository: jest.fn(),
}));

describe('UserService', () => {
  it('should return all users', async () => {
    const mockUserRepository = {
      find: jest.fn().mockResolvedValue([{ id: 1, name: 'John' }]),
    };

    // Mocking getRepository to return the mocked repository
    (getRepository as jest.Mock).mockReturnValue(mockUserRepository);

    const userService = new UserService();
    const users = await userService.getAllUsers();

    expect(users).toEqual([{ id: 1, name: 'John' }]);
    expect(mockUserRepository.find).toHaveBeenCalledTimes(1);
  });
});

এখানে, getRepository মক করা হয়েছে, এবং UserRepository এর find মেথডও মক করা হয়েছে। এর মাধ্যমে Unit Testing করা হয়েছে, যেখানে প্রকৃত ডেটাবেস ব্যবহার করা হয়নি।


২. Dependency Injection (DI) ব্যবহার করা

Dependency Injection (DI) ব্যবহৃত হয় ডিপেনডেন্সি (যেমন সার্ভিস, রেপোজিটরি) অন্য অবজেক্টের মধ্যে ইনজেক্ট করার জন্য। TypeORM-এ DI ব্যবহার করলে আপনি কমপ্লেক্স ডেটাবেস লজিক বা সার্ভিসগুলিকে আরও সহজভাবে টেস্ট করতে পারবেন।

TypeORM এর সাথে DI ব্যবহার করতে সাধারণত একটি DI container (যেমন InversifyJS বা Typedi) ব্যবহার করা হয়, যেটি ডিপেনডেন্সি ম্যানেজ করে এবং অবজেক্ট ইনজেকশন পরিচালনা করে।

Dependency Injection with TypeORM:

InversifyJS ব্যবহার করে TypeORM এর সাথে DI কিভাবে সেটআপ করবেন তা এখানে দেখানো হলো।

  1. Install dependencies:
npm install inversify reflect-metadata typeorm
  1. Create DI container and setup dependencies:
import { Container, injectable } from "inversify";
import { UserRepository } from "./repositories/UserRepository";

// Create the container
const container = new Container();

// Define a service that requires a dependency (e.g., UserRepository)
@injectable()
class UserService {
  private userRepository: UserRepository;

  constructor(userRepository: UserRepository) {
    this.userRepository = userRepository;
  }

  async getAllUsers() {
    return this.userRepository.find();
  }
}

// Register dependencies in container
container.bind(UserService).toSelf();
container.bind(UserRepository).toSelf();

// Get the instance of the UserService
const userService = container.get(UserService);

// Use the service
userService.getAllUsers().then((users) => {
  console.log(users);
});

এখানে, UserService এর মধ্যে UserRepository ইনজেক্ট করা হয়েছে। InversifyJS এর মাধ্যমে TypeORM রেপোজিটরি এবং সার্ভিসগুলোকে সেন্ট্রালাইজডভাবে পরিচালনা করা হচ্ছে, যা টেস্টিং এবং স্কেলেবিলিটি সহজ করে তোলে।


৩. Mocking TypeORM EntityManager

TypeORM এ EntityManager দিয়ে ডেটাবেস পরিচালনা করা যায়। এটি সার্ভিসে ইঞ্জেক্ট করা যেতে পারে এবং যদি আপনি EntityManager এর সাথে কাজ করেন তবে এটি মক করা যেতে পারে।

Example: Mocking EntityManager in TypeORM:

import { EntityManager } from "typeorm";
import { User } from "./entity/User";
import { getManager } from "typeorm";

// Mocking the EntityManager
jest.mock("typeorm", () => ({
  getManager: jest.fn(),
}));

describe("UserService", () => {
  it("should create a user", async () => {
    const mockEntityManager = {
      save: jest.fn().mockResolvedValue({ id: 1, name: "John" }),
    };

    (getManager as jest.Mock).mockReturnValue(mockEntityManager);

    const userService = new UserService();
    const user = await userService.createUser({ name: "John" });

    expect(user).toEqual({ id: 1, name: "John" });
    expect(mockEntityManager.save).toHaveBeenCalledTimes(1);
  });
});

এখানে EntityManager এর save মেথড মক করা হয়েছে, যাতে আপনি ডেটাবেসে কোন ডেটা সেভ না করেও টেস্টিং করতে পারেন।


সারাংশ

Mocking এবং Dependency Injection (DI) হল TypeORM এর সাথে টেস্টিং করার জন্য অত্যন্ত গুরুত্বপূর্ণ কৌশল। Mocking ব্যবহার করে আপনি ডেটাবেস ইন্টারঅ্যাকশন ছাড়া আপনার লজিক টেস্ট করতে পারেন, এবং DI ব্যবহার করে আপনি টেস্টিং এবং স্কেলেবিলিটির জন্য ডিপেনডেন্সি ইনজেকশন সহজে পরিচালনা করতে পারেন। Jest, InversifyJS, Typedi ইত্যাদি টুলসের মাধ্যমে এই কৌশলগুলি কার্যকরভাবে ব্যবহৃত হয় TypeORM প্রোজেক্টে।

Content added By
Promotion

Are you sure to start over?

Loading...