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