問題
utils.ts
function a() {
return "a"
}
function b() {
return a()
}
export { a, b }
例えばこういう風にb()
がa()
を呼ぶような場合、
utils.test.ts
import {a, b} from "./utils"
jest.mock("./utils", () => {
const original = jest.requireActual("./utils");
return {
...original,
a: jest.fn().mockReturnValue("modified a")
};
});
describe("utils", () => {
it("sholuld use mocked a()", () => {
expect(b()).toEqual("modified a")
expect(a).toHaveBeenCalledTimes(1)
});
});
こうやってもexpect(b()).toEqual("modified a")
でpassしない。
import * as utils from "./utils"
jest.spyOn(utils, 'a').mockImplementation(jest.fn().mockReturnValue("modified a"));
...
こうしても駄目。
どちらもb()
はmockされていないutils.ts
内のa()
を呼ぶことになる。
解決
utils.ts
import * as utils from "./utils" // 自分自身をimport
// import名は.test側と一致する必要はない
function a() {
return "a"
}
function b() {
return utils.a() // importしたものから呼び出す
}
export { a, b }
utils.test.ts
import * as utils from "./utils"
jest
.spyOn(utils, "a")
.mockImplementation(jest.fn().mockReturnValue("modified a"))
describe("utils", () => {
it("sholuld use mocked a()", () => {
expect(b()).toEqual("modified a")
expect(a).toHaveBeenCalledTimes(1)
});
});