Jest - 如何模拟函数中的方法

时间:2018-04-05 08:07:29

标签: javascript jestjs

我有一个ES6类A,我需要测试,我唯一想要改变的是一个方法的实现,以及所有其他的东西保持不变。

首先,我想手动创建一个像“myMock extends A”这样的模拟类,我会更改该方法并将其用于测试,但是存在一些问题。

无论如何,还有另一种方法可以让jest指定替换类中的特定方法吗?

我现在尝试做的是:

jest.mock("../myclass", () => {
return jest.fn().mockImplementation(() => {
    return {
        loadPopularItems: jest.fn(() => new Promise((resolve): void => 
           resolve()))
    };
  });
 });

现在这给了我一个错误,即myclass不是构造函数:

TypeError:myclass`.default不是构造函数

我想要做的就是从那里删除一些异步方法,这会产生HTTP请求。

1 个答案:

答案 0 :(得分:2)

您可以在测试中对原型上的方法进行存根:

A.prototype.loadPopularItems = jest.fn()

或者你可以使用jest.spyOn来轻松重置模拟:

jest.spyOn(A.prototype, "loadPopularItems");
jest.restoreAllMocks(); // avoids having to manually track mocks

更好的是,让你的类接受任何对象/函数将HTTP请求作为构造函数参数:

class A {
  constructor(http) {
    this.http = http;
  }

  loadPopularItems() {
     return this.http.fetchSomething();
  }
}

然后在你的测试中你可以传递一个虚假的实现:

const fakeHttp = {
  fetchSomething: jest.fn()
};

const instance = new A(fakeHttp);

这通常是优选的超过剔除方法。