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

How to test custom Repository in Nestjs/TypeORM applications

2 个月前提问
2 个月前修改
浏览次数33

1个答案

1

在NestJS/TypeORM应用程序中,测试自定义存储库通常涉及到单元测试和集成测试。以下是一个具体的步骤来说明如何测试自定义存储库:

1. 单元测试

单元测试专注于测试存储库的单个功能而不需要真实的数据库连接。我们可以使用 Jest 和 mock 来实现。

步骤:

  1. 创建和配置 Jest

    • 确保你的 NestJS 项目中已经安装了 Jest。
    • 配置 jest.config.js 文件,确保支持 TypeScript 和 NestJS 的结构。
  2. 模拟 TypeORM 的功能

    • 使用 Jest 的 mock() 函数来模拟 Repository 和其他 TypeORM 的关键功能。
    • 创建一个模拟存储库,用假数据和函数来代替真实的数据库操作。
  3. 编写测试用例

    • 编写测试用例来测试存储库的每个方法。
    • 使用 expect() 来检查函数的返回值是否符合预期。
    • 确保测试边界条件和异常处理。

示例代码

typescript
import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; import { MyEntity } from './entities/my-entity.entity'; import { MyRepository } from './my.repository'; describe('MyRepository', () => { let repository: MyRepository; let mockRepository = { find: jest.fn(), findOne: jest.fn(), save: jest.fn(), delete: jest.fn() }; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ MyRepository, { provide: getRepositoryToken(MyEntity), useValue: mockRepository, }, ], }).compile(); repository = module.get<MyRepository>(MyRepository); }); afterEach(() => { jest.clearAllMocks(); }); it('should find all entities', async () => { mockRepository.find.mockResolvedValue(['entity1', 'entity2']); expect(await repository.findAll()).toEqual(['entity1', 'entity2']); expect(mockRepository.find).toHaveBeenCalled(); }); // 其他测试用例... });

2. 集成测试

集成测试涉及到在更接近生产环境的设置中测试,这通常意味着有真实数据库的 involvement。

步骤:

  1. 使用 Docker 启动一个测试用的数据库实例

    • 使用 Docker Compose 来运行一个数据库实例,专门用于测试。
  2. 配置 TypeORM 连接到测试数据库

    • 在测试环境中配置 TypeORM 以连接到测试数据库。
  3. 编写集成测试用例

    • 编写测试用例来执行实际的数据库操作。
    • 检查数据库操作的结果是否符合预期。
    • 清理操作以保持测试的独立性和可重复性。

示例代码

typescript
describe('MyRepository Integration Tests', () => { let repository: MyRepository; beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: 'localhost', port: 5432, username: 'test', password: 'test', database: 'test_db', entities: [MyEntity], synchronize: true, }), TypeOrmModule.forFeature([MyEntity]), ], providers: [MyRepository], }).compile(); repository = module.get<MyRepository>(MyRepository); }); afterAll(async () => { // 关闭数据连接等清理工作 }); it('should create and retrieve an entity', async () => { await repository.save({ name: 'New Entity' }); const entity = await repository.findOne({ name: 'New Entity' }); expect(entity).toBeDefined(); expect(entity.name).toEqual('New Entity'); }); // 其他集成测试用例... });

通过这两种方法(单元测试和集成测试),你可以确保你的自定义存储库在 NestJS/TypeORM 应用程序中表现良好且可靠。

2024年7月31日 00:45 回复

你的答案