【问题标题】:Mocking a base class using jest framework使用 jest 框架模拟基类
【发布时间】:2020-01-11 03:00:10
【问题描述】:

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

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

这是由另一个类似的类扩展的。

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

class MyClass extends BaseClass {

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

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

}

现在我正在使用 jest 来测试 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);
  });
});

问题是一旦模拟被初始化,我无法像第二次测试那样重置和分配不同的值。我怎样才能做到这一点?

【问题讨论】:

  • 看看mockImplementationOnce,而不是两次调用mockImplementation。可能会有所帮助。祝你好运
  • @BenoitMessiaen 我做了一点编辑。当我尝试使用时, MockImplementation() 对我不起作用。我收到了 TypeError: Class extends value undefined is not a constructor or null 错误

标签: javascript unit-testing jestjs


【解决方案1】:

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

Jest 没有提供任何体面的方法来修改创建后的模拟,我认为他们没有改变这一点。 (无法链接任何来源,抱歉,这是前段时间)。

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

如果你多次遇到这个问题,简单,很干净,但如果你必须经常这样做,那就不方便了。

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

祝你好运

【讨论】:

  • 单个方法调用模拟函数两次时,问题变得复杂。
猜你喜欢
  • 2019-03-13
  • 2019-01-08
  • 2018-05-04
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2017-09-30
  • 2021-12-21
相关资源
最近更新 更多