NestJS测试ApexService无法解析ApexRepository依赖问题求助
报错原因
- 测试模块未注册
ApexService直接依赖的自定义仓库类ApexRepository:你当前在测试模块中只注入了TypeORM原生Repository<CompanyEntity>对应的Token,但ApexService构造函数的第一个入参是你自己封装的ApexRepository类,Nest测试上下文找不到对应的Provider,因此抛出依赖解析错误。 - 剩余依赖未提供对应的Provider:
ApexService还依赖KafkaProducer、SomeService两个类,你当前测试模块中只提供了PKUchetProducer,未匹配这两个依赖的注入Token,后续也会触发同类报错。 - 测试用例写法存在逻辑错误:原用例中
expect传入了未执行的async函数,也没有等待异步方法执行完成,即便依赖问题解决也无法得到正确的测试结果。
解决方案
如果你是对ApexService做单元测试,无需关心ApexRepository的内部实现,直接Mock整个ApexRepository即可,步骤如下:
- 新增各依赖的Mock工厂
// ApexRepository Mock export const apexRepositoryMockFactory: () => MockType<ApexRepository> = jest.fn(() => ({ getCompanyByBIN: jest.fn(), createCompany: jest.fn(() => 0), updateCompany: jest.fn(), })); // KafkaProducer Mock,根据你实际用到的方法补充 export const kafkaProducerMockFactory = jest.fn(() => ({ send: jest.fn(), })); // SomeService Mock,根据你实际用到的方法补充 export const someServiceMockFactory = jest.fn(() => ({ getConfig: jest.fn(), }));
- 修改测试模块的Provider配置
describe('ApexService', () => { let service: ApexService; let apexRepositoryMock: MockType<ApexRepository>; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ ApexService, { provide: ApexRepository, useFactory: apexRepositoryMockFactory, }, { provide: KafkaProducer, useFactory: kafkaProducerMockFactory, }, { provide: SomeService, useFactory: someServiceMockFactory, }, ], }).compile(); service = module.get<ApexService>(ApexService); apexRepositoryMock = module.get<MockType<ApexRepository>>(ApexRepository); }); // 测试用例... });
- 修正测试用例的异步调用逻辑
it('should create company', async () => { const dto = { bin: '00000000000', }; const result = await service.createCompany(dto); expect(result).toEqual({ data: 0, statusCode: 200, }); // 也可以加方法调用断言,验证逻辑正确性 expect(apexRepositoryMock.createCompany).toHaveBeenCalledWith(dto); });
如果你需要对ApexRepository本身做单元测试,才需要注入getRepositoryToken(CompanyEntity)对应的Mock,此时测试模块的Provider配置替换为ApexRepository和TypeORM仓库的Mock即可。
内容的提问来源于stack exchange,提问作者wildegor
相关产品推荐
相关产品推荐

