首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在jest中模拟静态类函数不起作用

问在jest中模拟静态类函数不起作用
EN

Stack Overflow用户
提问于 2020-07-22 20:56:58
回答 1查看 148关注 0票数 1

给定一个非常基本的javscript类

Foo.js

代码语言:javascript
复制
export default class Foo {
    static bar() {
        console.log("bar");
    }
}

如何模拟bar函数?

下面是我认为应该行得通的(但不是):

Foo.test.js

代码语言:javascript
复制
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);打印了一个空列表,所以使用了模拟函数。

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-22 21:30:45

类在导入后被模拟,模拟不会影响它。jest.mock应该被移到顶层,这样它就可以在import之前被提升,或者如果这个类不需要在整个套件中被模仿,那么import应该放在测试中,并有可能被require取代。

bar方法没有被模仿,因为它是静态方法,但它是被模仿的原型方法。方法不应该被赋值所模仿,因为这会阻止它们被恢复。

它应该是:

代码语言:javascript
复制
jest.spyOn(Foo, 'bar').mockImplementation(() => ...);

最好使用jest.restoreAllMocks()或restoreMocks配置选项进行恢复,以不影响其他测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63034772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档