search
LoginSignup
13

More than 1 year has passed since last update.

posted at

updated at

Organization

Jest mockClear(), mockReset(), mockRestore() の違い

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);
  });
});

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
13