🧪

Jestの mockClear, mockReset, mockRestore の使い分け

2024/11/08に公開

目次

  1. 結論
  2. 各メソッドの挙動の違い
  3. 具体例
  4. まとめ

1. 結論

メソッド 呼び出し履歴のクリア 実装/戻り値のリセット オリジナルの実装に戻す 主な用途
mockClear 呼び出し履歴のみをリセット
mockReset 実装や戻り値も含めて完全にリセット
mockRestore ✅(スパイのみ) ✅(スパイのみ) ✅(スパイのみ) 元の実装に戻し、テスト終了後に元に戻したい場合に使用

2. 各メソッドの挙動の違い

mockClear

  • 役割: モック関数の呼び出し履歴をクリア
  • 影響: 関数の実装や戻り値の設定には影響しない
  • 主な用途: 同じモックを複数のテストで使う際に呼び出し履歴だけをリセットしたい場合

mockReset

  • 役割: 呼び出し履歴とともにモック関数の実装や戻り値のリセットも行う
  • 影響: mockImplementationなどで設定した実装もクリアされる
  • 主な用途: 完全に初期状態に戻し、別のテストで異なる実装を設定したい場合

mockRestore

  • 役割: jest.spyOnで設定した関数を元の実装に戻す
  • 影響: モジュールのオリジナルの実装を元に戻し、テスト終了後に元の動作に復元
  • 主な用途: オリジナルの実装を一時的にモックしてテストを行い、テスト後に戻したい場合

3. 具体例

mockClearの使用例

const myMock = jest.fn();
myMock('first call');
myMock.mockClear();
console.log(myMock.mock.calls.length); // 出力: 0

mockResetの使用例

const myMock = jest.fn().mockReturnValue('initial value');
console.log(myMock()); // 出力: 'initial value'
myMock.mockReset();
console.log(myMock()); // 出力: undefined

mockRestoreの使用例

const myFunction = jest.spyOn(myModule, 'myFunction');
myFunction.mockImplementation(() => 'mocked value');
console.log(myModule.myFunction()); // 出力: 'mocked value'
myFunction.mockRestore();
console.log(myModule.myFunction()); // オリジナルの実装に戻る

4. まとめ

  • mockClearは、呼び出し履歴だけをリセットして実装は保持したいときに使う。
  • mockResetは、呼び出し履歴も実装もリセットし、完全に初期状態に戻したいときに使用。
  • mockRestoreは、スパイを元の実装に戻し、テスト後の実装復元が必要な場合に便利。

Discussion