web-dev-qa-db-ja.com

手動モックがJestで機能しない

誰かが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"
3
dumazy

モジュールのモックは、可能な場合はbabel-jest変換で持ち上げられるため、モジュールのモックが作成されます。

import ModuleA from "../src/ModuleA"
jest.mock("../src/ModuleA") // hoisted to be evaluated prior to import

jest.mockbeforeEach関数に存在するため、モジュールをテストごとにモックする必要がある場合、これは機能しません。

この場合、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
estus