乐闻世界logo
搜索文章和话题

如何在 NestJS 中对 TypeORM 的自定义存储库进行单元测试?

5 个月前提问
5 个月前修改
浏览次数40

1个答案

1

在NestJS中使用TypeORM时,进行单元测试需要确保代码的可测试性和依赖项的正确管理。下面我将详细介绍如何为一个自定义的TypeORM存储库进行单元测试。

步骤 1: 设置测试环境

首先,需要确保你的测试环境已经搭建好了,这通常意味着你已经在你的项目中安装了Jest和@nestjs/testing模块。

步骤 2: 创建存储库的Mock

为了进行单元测试,我们需要模拟TypeORM的存储库。这里可以使用jest.mock()或者NestJS的@InjectRepository()装饰器来注入存储库的Mock。例如,假设我们有一个名为UsersRepository的自定义存储库:

typescript
import { EntityRepository, Repository } from 'typeorm'; import { User } from './entities/user.entity'; @EntityRepository(User) export class UsersRepository extends Repository<User> { findByName(name: string): Promise<User | undefined> { return this.findOne({ name }); } }

你可以创建一个Mock版本的这个存储库:

typescript
const mockUsersRepository = () => ({ findByName: jest.fn().mockResolvedValue(mockUser), });

步骤 3: 配置TestingModule

接下来,在你的测试文件中,使用NestJS的Test模块来配置你的测试环境。确保你替换了真实的存储库实例为Mock实例:

typescript
import { Test, TestingModule } from '@nestjs/testing'; import { UsersService } from './users.service'; import { UsersRepository } from './users.repository'; describe('UsersService', () => { let service: UsersService; let repository: ReturnType<typeof mockUsersRepository>; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ UsersService, { provide: UsersRepository, useFactory: mockUsersRepository, }, ], }).compile(); service = module.get<UsersService>(UsersService); repository = module.get<UsersRepository>(UsersRepository); }); it('should be defined', () => { expect(service).toBeDefined(); expect(repository).toBeDefined(); }); // 更多的测试... });

步骤 4: 编写单元测试

现在,你可以针对你的UsersService或直接对UsersRepository中的方法编写单元测试。例如,测试findByName方法:

typescript
describe('findByName', () => { it('should return a user by name', async () => { const user = await service.findByName('Alice'); expect(user).toEqual(mockUser); expect(repository.findByName).toHaveBeenCalledWith('Alice'); }); });

在这个测试中,我们验证了当调用findByName时,是否返回了预期的用户对象,并且确认这个方法被正确地调用了。

总结

通过以上步骤,你可以有效地为NestJS中使用TypeORM的自定义存储库进行单元测试。关键在于使用Mock来隔离测试,确保不依赖外部数据库或其它服务,并且保持测试的独立性和可重复性。

2024年8月3日 17:00 回复

你的答案