针对实际数据库测试NestJS服务

问题描述 投票:1回答:2

我希望能够针对实际数据库测试我的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实例上执行saveRepository时,底层的Repository似乎未定义。这是堆栈回溯:

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

似乎没有初始化具有TypeORM EntityManager类的Repository实例;这个回溯正在抱怨的是undefined参考。

如何正确初始化RepositoryEntityManager

谢谢,汤姆。

javascript node.js typescript nestjs typeorm
2个回答
2
投票

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

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

0
投票

以下是使用Kim Kern建议的测试更新。

describe("DepartmentService", () => {
  let service: DepartmentService;
  let repo: Repository<Department>;
  let module: TestingModule;

  beforeAll(async () => {
    module = await Test.createTestingModule({
      imports: [
        TypeOrmModule.forRoot(),
        TypeOrmModule.forFeature([Department])
      ],
      providers: [DepartmentService]
    }).compile();

    service = module.get<DepartmentService>(DepartmentService);
    repo = module.get<Repository<Department>>(getRepositoryToken(Department));
  });

  afterAll(async () => {
    module.close();
  });

  it("should be defined", () => {
    expect(service).toBeDefined();
  });

  // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.