Javascript Jest-如何在函数中模拟方法

Javascript Jest-如何在函数中模拟方法,javascript,jestjs,Javascript,Jestjs,我有一个ES6类A,我需要测试,我唯一想改变的是一个方法的实现,所有其他的事情都保持原样 首先,我想手动创建一个类似“myMock Extendes a”的模拟类,在该类中我将更改该方法并将其用于测试,但存在一些问题 总之,jest还有其他方法可以指定类中特定方法的替换吗 我现在想做的是: jest.mock("../myclass", () => { return jest.fn().mockImplementation(() => { return { l

我有一个ES6类A,我需要测试,我唯一想改变的是一个方法的实现,所有其他的事情都保持原样

首先,我想手动创建一个类似“myMock Extendes a”的模拟类,在该类中我将更改该方法并将其用于测试,但存在一些问题

总之,jest还有其他方法可以指定类中特定方法的替换吗

我现在想做的是:

jest.mock("../myclass", () => {
return jest.fn().mockImplementation(() => {
    return {
        loadPopularItems: jest.fn(() => new Promise((resolve): void => 
           resolve()))
    };
  });
 });
现在,这给了我一个错误,即myclass不是构造函数:

TypeError:myclass`。默认值不是构造函数


我所要做的就是从那里删除一些发出HTTP请求的异步方法。

您可以在测试中在原型上删除该方法:

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

一般来说,这比剔除方法更可取

发布一些代码。