使用Jest框架模拟基类

时间:2020-01-10 15:42:33

标签: javascript unit-testing jestjs

我有一个基类,如下所示。

class BaseClass {
  .....
  .....
  async request(options) {
    .......
    .......
  }
}

这被另一个类似的类扩展。

const BaseClass = require('@myorg/base-class').BaseClass;

class MyClass extends BaseClass {

      async method1() {
        .............
        request()
        .............
      }

      async method2() {
        .............
        request()
        .............
      }

}

现在,我正在使用笑话来测试MyClass及其2种方法并模拟BaseClass,并尝试为其请求方法发送模拟的响应。由于我需要同时测试method1和method2,因此我需要在第一个之后更改模拟返回。我就是这样。

describe('MyClass', () => {
  afterEach(() => {
    jest.clearAllMocks();
    jest.resetAllMocks();
  });
  let MockClass = class BaseClass {
    request() {
      return {
        statusCode: 200,
        body: JSON.stringify({
          first_response: 'first_response'
        })
      };
    }
  };
  const mock = jest.mock('@myorg/base-class', () => {
    return {
      BaseClass: MockClass
    };
  });
  it('#method1 - test method one', async () => {
    const myClass = require('../src').myClass;
    const res = await myClass.method1();
    expect(res).toEqual('first_response');
  });

  it('#method2 - test method 2', async () => {
    mock.clearAllMocks();
    mock.resetAllMocks();
    MockClass = class BaseClass {
      request() {
        return {
          statusCode: 200,
          body: JSON.stringify({
            random_response: 'random_response'
          })
        };
      }
    };
    const myClass = require('../src').myClass;
    const res = await myClass.method2();
    expect(JSON.parse(res.body)).toEqual({
      random_response: 'random_response'
    });
    expect(res.statusCode).toEqual(200);
  });
});

问题在于,一旦模拟被初始化,我就无法像第二个测试一样重置并分配其他值。我该如何实现?

1 个答案:

答案 0 :(得分:0)

一年前,我遇到了类似的问题。我有2个调用相同模拟方法的测试,但我希望有2个不同的输出。

Jest没有提供任何像样的方式来修改模拟,一旦创建,我想他们并没有改变。 (无法链接任何源,对不起,这是前一阵子。)

我有机会与一些经验丰富且有才华的程序员进行讨论,解决方法是在两个不同的文件中进行测试,并为该模拟程序提供2种实现。

简单,很干净,如果您多次遇到此问题,但如果必须经常执行,则不方便。

如果您有更好的解决方法或解决方法,请告诉我!

祝你好运