【问题标题】:Nest.js testing module, can not override provider injected into another provider, undefined receivedNest.js 测试模块,不能覆盖注入另一个提供者的提供者,未定义接收
【发布时间】:2023-04-04 08:17:01
【问题描述】:

我有 Nest.js 应用程序,其中某个提供程序被注入另一个提供程序:

export class AppService {
  public constructor(private readonly appInnerService: AppInnerService) {}
}

AppService 有一个方法publish,它调用appInnerService send 方法。我为 AppService 创建了单元测试,我想在其中模拟 AppInnerService 提供程序:

  describe('App service', () => {
      let appService: AppService;
      const appInnerService = {
        send: jest.fn(),
      };
    
      beforeAll(async () => {
        const moduleRef = await Test.createTestingModule({
          providers: [AppService, AppInnerService],
        })
          .overrideProvider(AppInnerService)
          .useValue(appInnerService)
          .compile();
    
        appService = moduleRef.get<AppService>(AppService);
      });

      it('should work', () => {
        appService.publish({});

        expect(appInnerService.send).toHaveBeenCalled();
      });
    }

上面的代码不起作用,AppInnerService 没有注入到 AppService 中,而是将 undefined 传递给构造函数。为什么上面的测试不起作用,我该如何修复它(不用手动创建带有模拟服务的 AppService 类,我想使用 @nestjs/testing 包创建的测试模块)?

【问题讨论】:

  • 为什么使用overrideProvider 而不是custom provider 代替AppInnerService
  • 没关系,还是不行。我尝试了不同的组合:自定义提供程序,在 Test.createTestingModule 中导入整个模块,然后覆盖除已测试的提供程序之外的所有提供程序,结果始终相同,AppInnerService 未注入 AppService
  • AppService@Injectable(),对吧?
  • 。好吧,我正要回答“是的,当然”,但我检查了我的完整代码以确保绝对确定,结果发现我的代码中有错字。而不是我的类声明上方的“@Injectable()”,我只有“Injectable()”。无论如何,非常感谢,我浪费了将近一半的工作日来解决这个问题:(

标签: jestjs nestjs nestjs-testing


【解决方案1】:

为了解决问题:AppService 需要用@Injectable() 进行修饰,以获取 typescript 以反映构造函数参数元数据。只有Injectable(),它只是一个函数调用而不是装饰器,所以元数据没有反映,Nest 无法对其采取行动。

【讨论】:

    猜你喜欢
    • 2019-04-04
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2013-02-09
    • 2020-03-04
    • 1970-01-01
    • 2022-12-20
    相关资源
    最近更新 更多