Skip to content

spyについて

スパイは、テスト対象の関数やメソッドの呼び出し状況を監視するためのツールです。スパイは、モック(Mock)やスタブ(Stub)とは異なり、元の関数の振る舞いを変更せずに、その呼び出しに関する情報を記録します。

スパイを使うと、以下の情報を検証できます。

  • 呼び出し回数: 関数が何回呼び出されたか。
  • 呼び出し時の引数: 関数がどの引数で呼び出されたか。
  • 呼び出し元: 関数がどの場所から呼び出されたか。

たとえば、ユーザー作成処理をテストする際に、実際にメールを送信する関数が正しく1回だけ呼び出されたかを確認したいとします。この場合、メール送信関数をスパイすることで、実際のメール送信は行わずに、呼び出しの事実だけを検証できます。

スパイと似た概念にモックがありますが、両者には明確な違いがあります。

スパイ (Spy)モック (Mock)
振る舞い元の関数の振る舞いを維持する。
目的呼び出し状況を検証する。
用途外部との連携など、実際の処理は実行させたいが、その呼び出しを記録したい場合。

簡単に言うと、スパイは「本当に呼び出されたか?」を検証し、モックは「この依存関係がこの値を返したらどうなるか?」をシミュレートするものです。

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(); // スパイを解除し、元の関数に戻す

このように、スパイはテストの正確性を高め、不要な副作用(例: 実際にデータベースに書き込むこと)を防ぎながら、ロジックの内部的な動作を詳細に検証するのに役立ちます。