Jestでモジュールの特定の関数だけモックする


Jestでモジュールをモックするのは便利ですが、モジュールの一部をモックしたい場合に困ることがあります。

// my-module.js
export function foo() { ... }
export function bar() { ... } // bar だけモックしたい
import { foo, bar } from "./my-module";

jest.mock("./my-module", () => ({
  bar: jest.fn(),
}));

describe("foo", () => {
  it("works", () => {
    expect(foo("yay")).toEqual("wow");
  });
});

上記のように書いた場合に、 TypeError: foo is not a function といったエラーになってしまいます。それを回避するには以下のように書きます。

jest.mock("./my-module", () => ({
  ...jest.requireActual("./my-module"), // foo: jest.requireActual("./my-module").foo でも可
  bar: jest.fn(),
}));

Jest的に認められた書き方なのかは怪しいですがとりあえず bar をモックして foo はモックせず動かせます

参照

https://github.com/facebook/jest/issues/936#issuecomment-613220940
https://jestjs.io/docs/en/jest-object#jestrequireactualmodulename