Jest の mockClear()
, mockReset()
, mockRestore()
の違いが分かりづらいのでまとめておく。
また jest.clearAllMocks()
, jest.resetAllMocks()
, jest.restoreAllMocks()
もすべてのモックが対象になるだけで挙動としては同じ。
mockClear()
mockFn.mock.calls
, mockFn.mock.instances
を初期化する。
const now = () => Date.now();
describe('mock example', () => {
const mockedDateNow = jest.spyOn(Date, 'now').mockReturnValue(0);
it('mockClear', () => {
now();
mockedDateNow.mockClear();
// calls, instances はすべて初期化されている
expect(mockedDateNow.mock.calls.length).toBe(0);
expect(mockedDateNow.mock.instances.length).toBe(0);
// mockReturnValue の設定は初期化されていない
expect(now()).toBe(0);
});
});
mockReset()
mockFn.mock
, mockFn.mock.calls
, mockFn.mock.instances
を初期化する。
また mockImplementation
, mockReturnValue
等で設定した実装、戻り値もすべてリセットされる。
const now = () => Date.now();
describe('mock example', () => {
const mockedDateNow = jest.spyOn(Date, 'now').mockReturnValue(0);
it('mockReset', () => {
now();
mockedDateNow.mockReset();
// calls, instances はすべて初期化されている
expect(mockedDateNow.mock.calls.length).toBe(0);
expect(mockedDateNow.mock.instances.length).toBe(0);
// mockReturnValue の設定も初期化されている
expect(now()).not.toBe(0);
});
});
mockRestore()
jest.spyOn
によって作成されたモックをオリジナルのものへ戻す。
const now = () => Date.now();
describe('mock example', () => {
const mockedDateNow = jest.spyOn(Date, 'now').mockReturnValue(0);
it('mockRestore', () => {
now();
mockedDateNow.mockRestore();
// mockRestore() により Date.now がモックでなくなっている
expect((Date.now as any).mock).toBe(undefined);
});
});