jestjs - Nest.js 测试模块,无法覆盖注入(inject)到另一个提供程序中的提供程序,收到未定义

标签 jestjs nestjs nestjs-testing

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

    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 没有注入(inject)到 AppService 中,而是将 undefined 传递给构造函数。为什么上述测试不起作用以及如何修复它(无需使用模拟服务手动创建 AppService 类,我想使用 @nestjs/testing 包创建的测试模块)?

最佳答案

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

关于jestjs - Nest.js 测试模块,无法覆盖注入(inject)到另一个提供程序中的提供程序,收到未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69557771/

相关文章:

node.js - 嵌套 js 中的错误 node_modules/jest-diff/build/diffLines.d.ts(8,13) : error TS1005: '=' expected.

nestjs - 使用@Injectable Scope/@Inject(REQUEST) NestJS 测试类

nestjs - 在 nest.js e2e 测试中覆盖单个测试中的提供者

javascript - 覆盖 jest-junit 默认输出位置?

node.js - 用 Jest 模拟 nodemailer.createTransport.sendMail

javascript - NestJs 异步 httpService 调用

node.js - TypeORM:自定义多对多关系

reactjs - Jest 和 React Native : How to mock AccessibilityInfo

reactjs - React - Jest Mock 内部组件