You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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即可,步骤如下:

  1. 新增各依赖的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(),
}));
  1. 修改测试模块的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);
  });
  // 测试用例...
});
  1. 修正测试用例的异步调用逻辑
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:15:04