开玩笑嘲笑静态类函数不起作用

时间:2020-07-22 12:56:58

标签: javascript unit-testing jestjs

给出一个非常基本的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。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

该类在导入后就被模拟了,模拟不会影响它。应该将jest.mock移到顶层,以便可以在import之前将其吊起,或者如果不需要为整个套件模拟该类,则应该将import放在其中测试,并可能替换为require

bar方法没有被模拟,因为它是静态方法,但是它是原型方法。不应通过赋值来嘲笑方法,因为这会阻止方法的恢复。

应该是:

jest.spyOn(Foo, 'bar').mockImplementation(() => ...);

最好使用jest.restoreAllMocks()restoreMocks配置选项将其还原,以不影响其他测试。