【问题标题】:How to mock third party library using jest如何使用 jest 模拟第三方库
【发布时间】:2019-12-14 06:13:29
【问题描述】:

我正在使用nestjs 开发node.js 应用程序 我有一个名为LoggerService 的课程,如下所示

export class LoggerService {

    private logger: Rollbar;

    constructor() {
        this.logger = this.setupLogger();
    }

    critical(...args: Array<string | Error | object | Date | any[]>) {
        this.logger.error(...args);
    }

    private setupLogger(): Rollbar {
        if (this.logger == null) {

            this.logger = new Rollbar({
                accessToken: 'token',
                environment: 'dev',
                captureUncaught: true,
                captureUnhandledRejections: true,
            });

        }

        return this.logger;
    }

现在我正在使用下面的玩笑为这个类编写单元测试。

describe('LoggerService.log', () => {
  let service: LoggerService;

  beforeEach(async () => {

    const module: TestingModule = await Test.createTestingModule({
      providers: [LoggerService],
    }).compile();

    service = module.get<LoggerService>(LoggerService);
  });

  it('critical', () => {
    service.critical('error','message');
    expect(???).toHaveBeenCalledWith('error', 'message')
  })

);

我的问题是如何检查(预期)是否调用了logger.error,或者如何在此类中模拟Rollbar

【问题讨论】:

    标签: javascript unit-testing jestjs nestjs rollbar


    【解决方案1】:

    1) 提供您的外部依赖项/库作为模块中的可注入令牌

    @Module({
      providers: [
        {
          provide: 'Rollbar',
          useFactory: async (configService: ConfigService) => new Rollbar({
                    accessToken: configService.accessToken,
                    environment: configService.environment,
                    captureUncaught: true,
                    captureUnhandledRejections: true,
                }),
          inject: [ConfigService],
        },
      ]
    

    2) 将其注入您的 LoggerService 而不是创建它

    export class LoggerService {
        constructor(@Inject('Rollbar') private logger: Rollbar) {
        }
    

    3) 现在你可以在测试中模拟你的依赖了

    const module: TestingModule = await Test.createTestingModule({
      providers: [
        LoggerService,
        { provide: 'Rollbar', useFactory: rollbarMockFactory },
      ],
    }).compile();
    

    【讨论】:

    • 太棒了,rollbarMockFactory 定义的地方只有一件事?
    • 很高兴您发现它有帮助。 :-) 那只是一个占位符。如果您想了解有关模拟的更多信息,请查看此线程:stackoverflow.com/a/55366343/4694994
    • 我这样做了,在我的测试中,我的代码类似于const module: TestingModule = await Test.createTestingModule({ providers: [ LoggerService, { provide: 'Rollbar', useFactory: jest.fn(() =&gt; ({ error: jest.fn(() =&gt; null), })) } ], }),但我收到此错误` Nest 无法解析 LoggerService (?) 的依赖项。请确保索引 [0] 处的参数在 _RootTestModule 上下文中可用,这是我的服务constructor(@Inject('Rollbar') private logger: Rollbar) { }
    • 服务器启动了吗?顺便说一句:您不应该在生产中使用纯字符串作为标记。为您的注入令牌定义一个常量。一定要确保你的令牌在任何地方都是一样的。
    • 顺便说一句,我将您的回复标记为答案,因为这是正确的方向
    猜你喜欢
    • 2018-11-17
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多