如何使用玩笑嘲笑第三方库 [英] How to mock third party library using jest

查看:104
本文介绍了如何使用玩笑嘲笑第三方库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am developing a node.js application using nestjs I have a class called LoggerService as below

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;
    }

现在,我正在使用下面的笑话为此类编写单元测试.

Now I am writing unit test for this class using jest as below.

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.

My question is how to check(expect) if logger.error is called, or how to mock Rollbar in this class.

推荐答案

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

1) Provide your external dependency/library as an injectable token in your module

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

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

2) Inject it in your LoggerService instead of creating it

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

3)现在,您可以在测试中模拟依赖项

3) Now you can mock your dependency in your test

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

这篇关于如何使用玩笑嘲笑第三方库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆