こんにちは!Jest を勉強中の新卒エンジニアの”つかちゃん”と申します! ✨
今回は、Jestでよく使われるモック関連の関数 clearAllMocks() と resetAllMocks() の違いについて、「どっちがどっちだっけ?」とテストを書いていてふと思ったので初心者の自分なりに調べたことをまとめてみました。同じようにモックの使い方で悩んでいる方の参考になれば嬉しいです!
この記事では:
- モックってなに?
clearAllMocks()とは?resetAllMocks()とは?- どっちを使えばいいの?
という順番で、わかりやすく解説していきます!
🧪 まず初めに「モック」ってなに?
モックとは、簡単にいうと…
本物の代わりに使う、テスト専用のダミーのことです。
たとえば、次のような関数があるとします。
function fetchUserData(userId) { return axios.get(`https://api.example.com/users/${userId}`); }
この関数をテストしたいけど、実際にAPIを呼び出すといろいろ大変なんです。
- ネットワーク状況に左右される
- 毎回APIが呼ばれて遅い
- 失敗するとテストも落ちる
そんなときに登場するのが「モック」!
Jestでは jest.mock() や jest.fn() を使って、関数をモック(偽物)に置き換えることができます。
const mockFunction = jest.fn(); mockFunction('hello'); console.log(mockFunction.mock.calls); // [['hello']]
これで、「関数が呼ばれたか?」「何回呼ばれたか?」「何を返すようにするか?」などを自由にコントロール&検証できます!
📝 モックは、まるで舞台の「代役」のような存在。 本番用の関数やAPIの代わりに、テスト用の“仮の相手”を演じてもらう感じですね。
🔄 clearAllMocks()とは?
Jestのモック関数(jest.fn()やjest.spyOn())は、「何回呼ばれたか」「引数は何だったか」「戻り値は何だったか」などの履歴情報を自動で記録しています。
jest.clearAllMocks() は、これらの履歴をすべてリセットするための関数です。
const mockFn = jest.fn(); mockFn('A'); mockFn('B'); console.log(mockFn.mock.calls.length); // 2 jest.clearAllMocks(); // 呼び出し履歴をクリア console.log(mockFn.mock.calls.length); // 0
簡単に表にしてまとめてみました!
| 項目 | 内容 |
|---|---|
| 対象 | モックの「履歴」 |
| 消えるもの | - 呼び出し履歴 - 引数の記録 - 戻り値の記録 |
| 残るもの | - 実装(関数本体) - 戻り値設定( mockReturnValue() など) |
| 戻る状態 | 実装・設定はそのままで、呼び出し履歴だけが初期化された状態 |
| 主な用途 | 同じ実装を使いつつ、テストごとに履歴をクリアして確認したい場合 |
| よく使う場所 | beforeEach() / 複数テストケースの履歴分離 / 軽量なリセットが必要な場面 |
💡ポイントは、モックの中身(戻り値など)はそのままということ!
🔃 resetAllMocks()とは?
jest.resetAllMocks() は、すべてのモック関数(jest.fn()やjest.spyOn()など)に対して、履歴と実装の両方をリセットする便利なユーティリティ関数です。
const mockFn = jest.fn(() => 'hello'); console.log(mockFn()); // 'hello' jest.resetAllMocks(); // 実装も履歴もリセット console.log(mockFn()); // undefined(初期状態に戻っている!)
ここで注目すべきは、単なる呼び出し履歴のリセットだけでなく、関数としての実装(戻り値や動作)も完全にリセットされている点です。
| 項目 | 内容 |
|---|---|
| 対象 | モックの「履歴」と「実装」 |
| 消えるもの | - 呼び出し履歴 - 実装(関数本体) - 戻り値設定( mockReturnValue() など) |
| 残るもの | なし(完全に初期状態に戻る) |
| 戻る状態 | jest.fn() を何も指定せずに作成した状態と同じ |
| 主な用途 | テスト環境を完全にリセットしたい場合 |
| よく使う場所 | beforeEach() / 大規模テスト / 複数のテスト間で副作用を避けたいとき |
📝 補足:resetの影響範囲に注意
jest.resetAllMocks() はグローバルに適用されるため、すべてのモック関数が対象になります。
特定のモックだけをリセットしたい場合は、個別に mockFn.mockReset() を使いましょう。
📋 違いをまとめると
| 機能 | clearAllMocks() |
resetAllMocks() |
|---|---|---|
| 呼び出し履歴のリセット | ✅ | ✅ |
| 実装(戻り値など)のリセット | ❌ | ✅ |
💡 どっちを使えばいいの?
| 状況 | 使う関数 |
|---|---|
| 呼び出し履歴だけリセットしたい(実装はそのまま) | clearAllMocks() |
| 実装も戻り値も初期化したい | resetAllMocks() |
用途によって使い分けましょう!
👀まとめ
今回二つの関数を比較してみてJestのモックリセット関数は、テストの独立性を保ち、予期せぬ副作用を防ぐための大切な道具だと改めて認識しました。今までなんとなく使っていたclearAllMocks()も用途に応じてうまく使い分けてより信頼性の高いテストが書けるよう心掛けようと思いました!
ここまで読んでいただきありがとうございました!✨
弊社ではエンジニアを募集しております。
この記事を読んで少しでも興味を持ってくださった方は、ぜひカジュアル面談でお話ししましょう!
下記リンクよりご応募お待ちしております!
iimon採用サイト / Wantedly / Green
参考文献・記事
https://zenn.dev/ka_projects/articles/fedbfeacbb2fb6
https://zenn.dev/sonicmoov/articles/d499515b602c38