给定一个非常基本的javscript类
Foo.js
export default class Foo {
static bar() {
console.log("bar");
}
}如何模拟bar函数?
下面是我认为应该行得通的(但不是):
Foo.test.js
import Foo from "./Foo.js";
it("test", () => {
jest.mock("./Foo.js"); // mock Foo class
const myMock = jest.fn(); // create a new mocking function
Foo.prototype.bar = myMock;
Foo.bar();
console.log(myMock.mock.calls);
});但是,测试中的Foo.bar()调用调用了原始函数(所以"bar“被记录下来),并且console.log(myMock.mock.calls);打印了一个空列表,所以使用了模拟函数。
我做错了什么?
发布于 2020-07-22 21:30:45
类在导入后被模拟,模拟不会影响它。jest.mock应该被移到顶层,这样它就可以在import之前被提升,或者如果这个类不需要在整个套件中被模仿,那么import应该放在测试中,并有可能被require取代。
bar方法没有被模仿,因为它是静态方法,但它是被模仿的原型方法。方法不应该被赋值所模仿,因为这会阻止它们被恢复。
它应该是:
jest.spyOn(Foo, 'bar').mockImplementation(() => ...);最好使用jest.restoreAllMocks()或restoreMocks配置选项进行恢复,以不影响其他测试。
https://stackoverflow.com/questions/63034772
复制相似问题