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.