给出一个非常基本的javscript类
S
Foo.js
如何模拟酒吧功能?
这是我认为应该工作的(但不是):
export default class Foo {
static bar() {
console.log("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()
打印一个空列表,因此使用了模拟函数istn。
我在做什么错了?
答案 0 :(得分:1)
该类在导入后就被模拟了,模拟不会影响它。应该将jest.mock
移到顶层,以便可以在import
之前将其吊起,或者如果不需要为整个套件模拟该类,则应该将import
放在其中测试,并可能替换为require
。
bar
方法没有被模拟,因为它是静态方法,但是它是原型方法。不应通过赋值来嘲笑方法,因为这会阻止方法的恢复。
应该是:
jest.spyOn(Foo, 'bar').mockImplementation(() => ...);
最好使用jest.restoreAllMocks()
或restoreMocks
配置选项将其还原,以不影响其他测试。