手动模拟不与Jest合作

时间:2018-04-06 13:50:40

标签: javascript ecmascript-6 jest

有人可以帮助我在Jest手动嘲笑吗? :) 我试着让Jest使用mock而不是实际的模块。

我的测试:

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

2 个答案:

答案 0 :(得分:1)

使用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而不是整个模块来实现。

答案 1 :(得分:0)

就我而言,这是区分大小写的问题:

模块文件名:buyQuantity

我是如何嘲笑它的:Autosuggest.js <-错误的情况