Skip to content
Latchkey

スパイとは?

スパイとは、関数をラップして、それがどのように呼び出されたかを記録し、必ずしもその振る舞いを置き換えることなく、それらの呼び出しについてアサーションを行えるようにするものです。

スパイはスタブとモックの中間に位置します。モックと同様に、呼び出しを記録してそれに対してアサートできます。モックとは異なり、多くの場合、実際の実装をラップしてそれを実行させ、ただ傍らで観察するだけです。スパイは、実際の振る舞いを使いつつ、インタラクションが起きたことを確認する必要がある場合に役立ちます。

スパイが記録するもの

スパイはすべての呼び出しのログを保持します。引数、順序、回数、そして時には戻り値です。そのログに対してアサートします。ラップした関数は、スパイの設定の仕方に応じて、通常どおり実行されたり、部分的に上書きされたり、完全に置き換えられたりします。

スパイとモックとスタブの違い

  • スタブ: 定型的な応答を提供し、何も記録しない。
  • スパイ: 通常は実際の振る舞いをラップし、呼び出しを記録する。
  • モック: 振る舞いを置き換え、呼び出しの期待値とともに設定される。
  • スパイとモックの境界は、フレームワークによって曖昧である。

簡単な例

ロガーにスパイを仕掛けて、実際のログを実行させたまま、それが呼び出されたことを確認し、あとで記録された呼び出しに対してアサートできます。

Spying on a real method
const spy = jest.spyOn(logger, "warn");
doRiskyThing();
expect(spy).toHaveBeenCalledTimes(1);

スパイが適切なツールとなるとき

テスト対象の振る舞いを変えることなく、analytics イベントやログ行のような副作用が発生したことを検証したい場合は、スパイに手を伸ばしましょう。モックよりも侵襲性が低く、スタブよりも観察力があります。

CIスイートにおけるスパイ

スパイはほぼ完全に高速なユニットテストの中に存在するため、CIに意味のあるフレーキーさや遅延を加えません。大規模なスイートを高速な runner で実行している場合でも、フィードバックが最も速いピラミッドの安価な土台にテストを留めるのに役立ちます。

重要なポイント

  • スパイは、後のアサーションのために関数がどのように呼び出されたかを記録します。
  • 多くの場合、振る舞いを置き換えるのではなく、実際の振る舞いをラップします。
  • 振る舞いを変えずに副作用を検証するにはスパイを使いましょう。

関連ガイド