Jestにおけるmock・spyOnの違い
TOC
初めてJestでテストコードを実装する時、mock
とspyOn
の違いについて迷う事があったので、備忘録として記事に残しておこうと思います。
mock(モック)
モックはテストの中で外部モジュールや関数を代替するためのもので、実際の処理を行わずに指定した値を返したり、特定のエラーをスローすることができます。モックは通常、外部の依存関係を持つ部分をテストする際に、その外部の動作をコントロールしたいときに使用します。
モックの特徴
- 実際の処理は行われず、代わりにモックが設定された動作をします。
- 呼び出しの回数や引数など、どのようにモックが使用されたかを検証することができます。
例
jest.mock('./externalModule', () => {
return {
externalFunction: jest.fn().mockReturnValue('mockedValue')
};
});
spyOn(スパイ)
spyOn
は既存の関数の呼び出しを監視します。spyOn
を使用すると、関数がどのように呼び出されたか、何回呼び出されたかなどの情報を取得できるようになります。しかし、spyOn
そのものは関数の動作を変更しません。動作の変更をしたい場合は、mockReturnValue
やmockImplementation
などの追加のメソッドを使用します。
スパイの特徴
- 元の関数の呼び出しを監視します。
- 呼び出しの情報を取得できますが、動作は変更しません(追加のメソッドで変更可能)。
例
const obj = {
myFunction: () => 'originalValue'
};
const spy = jest.spyOn(obj, 'myFunction');
obj.myFunction();
expect(spy).toHaveBeenCalled();
まとめ
mock
は外部の動作を完全にコントロールするためのもので、実際の処理は行われません。spyOn
は既存の関数の呼び出しを監視し、その情報を取得するためのものです。
Search Posts