手动模拟不与开玩笑一起工作

问题描述 投票:0回答:3
有人可以帮我开玩笑地嘲笑我吗? :) 我试图让玩笑使用模拟而不是实际模块。 我的测试:

// __tests__/mockTest.js import ModuleA from "../src/ModuleA" describe("ModuleA", () => { beforeEach(() => { jest.mock("../src/ModuleA") }) it("should return the mock name", () => { const name = ModuleA.getModuleName() expect(name).toBe("mockModuleA") }) })

我的代码:

// src/ModuleA.js
export default {
    getModuleName: () => "moduleA"
}

// src/__mocks__/ModuleA.js
export default {
    getModuleName: () => "mockModuleA"
}

我认为我遵循了所有内容

对手册模拟说的一切,但也许我在这里忽略了一些东西? 这是我的结果:
Expected value to be:
      "mockModuleA"
Received:
      "moduleA"

模型在可能的情况下会悬挂在
babel-jest
变换时,因此将导致模拟模块:
javascript ecmascript-6 jestjs
3个回答
39
投票
import ModuleA from "../src/ModuleA" jest.mock("../src/ModuleA") // hoisted to be evaluated prior to import

如果应该根据测试嘲笑模块,则不会工作,因为
jest.mock

驻留在
beforeEach
函数中。

在这种情况下应使用:

require
由于它不是导出,而是默认导出的方法,应该嘲笑这也可以通过模拟

describe("ModuleA", () => { beforeEach(() => { jest.mock("../src/ModuleA") }) it("should return the mock name", () => { const ModuleA = require("../src/ModuleA").default; const name = ModuleA.getModuleName() expect(name).toBe("mockModuleA") }) })

而不是整个模块来实现。


这个答案与操作问题并不严格相关,但是Google带领我在这里出于类似的问题而引起了我在文件根部无效的类似问题。就我而言,这是由循环依赖性引起的。因此,如果Jest突然开始忽略to的电话,那么您可能需要检查文件中是否有循环依赖项。

我知道已经有一段时间了,但是截至2025年,经过几天的搜索,我发现不幸的是,

mock不适用于JavaScript ES6(Ecmascript)

在这里阅读

5
投票

启动我们必须使用

jest.mock('module', () => ({}))
jest.mock()


0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.