Jest原生JavaScript环境下ES6类自动Mock失败,调用mockClear报错
问题原因
你当前使用Jest 27的原生ESM实验模式(通过--experimental-vm-modules启用),此模式下的自动Mock逻辑和CommonJS模式存在差异:自动Mock生成的类mock实例的mockClear、toHaveBeenCalled等属性/方法,不会直接挂载到default导出的导入变量上,所以直接调用Foo.mockClear会抛出不存在的错误。
解决方案
修改测试文件的导入方式,导入整个Foo模块后访问default导出的mock实例即可,修改后的测试代码如下:
import * as FooModule from "../src/foo.js"; import FooStorage from "../src/foostorage.js"; import { jest } from "@jest/globals"; jest.mock("../src/foo.js"); beforeEach(() => { FooModule.default.mockClear(); }); test("if the Foo constructor hasn`t been called", () => { const storage = new FooStorage(); expect(FooModule.default).not.toHaveBeenCalled(); });
可选优化
如果希望后续升级减少适配问题,可将Jest版本升级到28及以上,原生ESM的Mock兼容逻辑已经做了大量优化,很多CommonJS下的Mock写法可以直接复用。
内容的提问来源于stack exchange,提问作者Ich
相关产品推荐
相关产品推荐

