javascript 手动模拟无法与Jest配合使用

lfapxunr  于 2022-12-02  发布在  Java
关注(0)|答案(2)|浏览(140)

有人能帮我在Jest中手动模拟吗?:)我试图让Jest使用模拟而不是实际模块。
我的测试:

// __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"
}

我想我遵循了documentation关于手动模拟的所有说明,但也许我忽略了一些东西?这是我的结果:

Expected value to be:
      "mockModuleA"
Received:
      "moduleA"
wfsdck30

wfsdck301#

模块mock在可能的情况下使用babel-jest转换提升,因此这将导致模拟的模块:

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")
    })
})

因为它不是一个导出,而是默认导出中的一个方法,应该被模拟,这也可以通过模拟ModuleA.getModuleName而不是整个模块来实现。

1rhkuytd

1rhkuytd2#

这个答案与OPs问题并没有严格的关系,但是google让我在这里遇到了一个类似的问题,即文件根目录中的jest.mock('module', () => ({}))不起作用。在我的例子中,这是由循环依赖引起的。所以如果jest突然开始忽略对jest.mock()的调用,那么你可能需要检查文件中的循环依赖。

相关问题