spyについて
スパイ(Spy)とは
Section titled “スパイ(Spy)とは”スパイは、テスト対象の関数やメソッドの呼び出し状況を監視するためのツールです。スパイは、モック(Mock)やスタブ(Stub)とは異なり、元の関数の振る舞いを変更せずに、その呼び出しに関する情報を記録します。
スパイの主な機能
Section titled “スパイの主な機能”スパイを使うと、以下の情報を検証できます。
- 呼び出し回数: 関数が何回呼び出されたか。
- 呼び出し時の引数: 関数がどの引数で呼び出されたか。
- 呼び出し元: 関数がどの場所から呼び出されたか。
たとえば、ユーザー作成処理をテストする際に、実際にメールを送信する関数が正しく1回だけ呼び出されたかを確認したいとします。この場合、メール送信関数をスパイすることで、実際のメール送信は行わずに、呼び出しの事実だけを検証できます。
モック(Mock)との違い
Section titled “モック(Mock)との違い”スパイと似た概念にモックがありますが、両者には明確な違いがあります。
| スパイ (Spy) | モック (Mock) |
|---|---|
| 振る舞い | 元の関数の振る舞いを維持する。 |
| 目的 | 呼び出し状況を検証する。 |
| 用途 | 外部との連携など、実際の処理は実行させたいが、その呼び出しを記録したい場合。 |
簡単に言うと、スパイは「本当に呼び出されたか?」を検証し、モックは「この依存関係がこの値を返したらどうなるか?」をシミュレートするものです。
Jestにおけるスパイの使い方
Section titled “Jestにおけるスパイの使い方”JavaScriptのテストフレームワークJestは、jest.spyOn()メソッドを使ってスパイ機能を提供します。
// 検証対象のモジュールconst MyService = { logMessage: (message) => console.log(message),};
// スパイの作成const spy = jest.spyOn(MyService, 'logMessage');
// スパイ対象の関数を呼び出すMyService.logMessage('テストメッセージ');
// 呼び出し状況を検証するexpect(spy).toHaveBeenCalled(); // logMessageが呼び出されたか?expect(spy).toHaveBeenCalledTimes(1); // 1回呼び出されたか?expect(spy).toHaveBeenCalledWith('テストメッセージ'); // 指定の引数で呼び出されたか?
// 後処理(重要)spy.mockRestore(); // スパイを解除し、元の関数に戻すこのように、スパイはテストの正確性を高め、不要な副作用(例: 実際にデータベースに書き込むこと)を防ぎながら、ロジックの内部的な動作を詳細に検証するのに役立ちます。