首页 > 解决方案 > 针对实际数据库测试 NestJS 服务

问题描述

我希望能够针对实际数据库测试我的 Nest 服务。我知道大多数单元测试应该使用模拟对象,但有时对数据库本身进行测试也是有意义的。

我已经搜索了 Nest 的 SO 和 GH 问题,并且开始达到所有答案的传递闭包。:-)

我正在尝试从https://github.com/nestjs/nest/issues/363#issuecomment-360105413工作。以下是我的单元测试,它使用自定义提供程序将存储库传递给我的服务类。

describe("DepartmentService", () => {
  const token = getRepositoryToken(Department);
  let service: DepartmentService;
  let repo: Repository<Department>;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        DepartmentService,
        {
          provide: token,
          useClass: Repository
        }
      ]
    }).compile();

    service = module.get<DepartmentService>(DepartmentService);
    repo = module.get(token);
  });

一切都正确编译,TypeScript 似乎很开心。但是,当我尝试在我的create实例上执行时,底层似乎是未定义的。这是堆栈回溯:save RepositoryRepository

TypeError: Cannot read property 'create' of undefined

  at Repository.Object.<anonymous>.Repository.create (repository/Repository.ts:99:29)
  at DepartmentService.<anonymous> (relational/department/department.service.ts:46:53)
  at relational/department/department.service.ts:19:71
  at Object.<anonymous>.__awaiter (relational/department/department.service.ts:15:12)
  at DepartmentService.addDepartment (relational/department/department.service.ts:56:16)
  at Object.<anonymous> (relational/department/test/department.service.spec.ts:46:35)
  at relational/department/test/department.service.spec.ts:7:71

看起来EntityManagerTypeORMRepository类的实例没有被初始化;这是undefined这个回溯抱怨的参考。

如何获得RepositoryandEntityManager正确初始化?

谢谢,汤姆。

标签: javascriptnode.jstypescriptnestjstypeorm

解决方案


要正确初始化 typeorm,您应该能够TypeOrmModule在测试中导入:

Test.createTestingModule({
  imports: [
   TypeOrmModule.forRoot({
        type: 'mysql',
        // ...
   }),
   TypeOrmModule.forFeature([Department])
  ]

推荐阅读