Trung BìnhNestJS iconNestJS

Mock providers trong NestJS unit tests — TestingModule và jest.fn()?

Unit tests trong NestJS isolate một class bằng cách mock tất cả dependencies.

Pattern chuẩn với Test.createTestingModule():

typescript
describe('UsersService', () => {
  let service: UsersService;
  let repo: jest.Mocked<Repository<User>>;

  beforeEach(async () => {
    const mockRepo = {
      find: jest.fn(),
      findOne: jest.fn(),
      save: jest.fn(),
      delete: jest.fn(),
    };

    const module: TestingModule = await Test.createTestingModule({
      providers: [
        UsersService,
        { provide: getRepositoryToken(User), useValue: mockRepo },
      ],
    }).compile();

    service = module.get<UsersService>(UsersService);
    repo = module.get(getRepositoryToken(User));
  });

  it('should find user by id', async () => {
    const user = { id: 1, email: 'test@test.com' };
    repo.findOne.mockResolvedValue(user);

    const result = await service.findOne(1);
    expect(result).toEqual(user);
    expect(repo.findOne).toHaveBeenCalledWith({ where: { id: 1 } });
  });
});

Dùng jest.spyOn() để spy mà không replace hoàn toàn.

Dùng jest.clearAllMocks() trong afterEach để reset state.

Xem toàn bộ NestJS cùng filter theo level & chủ đề con.

Mở danh sách NestJS