関数は何と共に何回呼ばれたか(spy)ができます。通してデータを保存・取得するメソッドを持っていたとします。何かしらの制約を持ってるのではと思います。叩いてしまうと、決められた順番に実行しなければパスできない実質1つの巨大なテストケースになってしまいます。後処理が必要なものだったりするともっと大変。周りの機能は完全にモジュール外の要素です。叩かないといけないのか。ユニットテストレベルではその辺までしっかりする必要性は薄いです。この辺(+α)を以下のような決めた値を返すだけのスタブに変えてしまいます。このような既存のモジュールをモック化するいくつかの機能を持ってます。jest.mockもしあるモジュールがエクスポートしてる機能をまとめてモック化したいならjest.mock(path)を使います。これは関数はもちろんオブジェクトが持ってるメソッドなどをすべてundefinedを返すモック(spy)に書き換えます。開発しているモジュールmy-client.jsが以下のような実装だとします。}}また、テストファイルでは以下のようにこのモジュールを使ってるとします。]);});my-clientはcross-fetchモジュールに依存しており、今の所getテストでは実際にcross-fetchを通してリクエストを飛ばしてしまいます。レスポンスデータが2件の時だけパスできます。仕様によっては、このテストは失敗するようになるかもしれません。'b'}]を返す関数にしてしまいます。それには以下のような行を挟みます。}]});mockResolvedValueOnce(value)は1度だけPromise.resolve(value)を返すモック関数化できます。my-clientの中のget関数は、単に取得したデータを返すだけなので、これで常にgetテストが通るようになります。上記のテストではテストファイルで直接モックを作りました。中にはいくつものモック関数をテストファイルの中で作る必要があったり、何度も同じことを書く必要があったりで使いまわしたい場面がでてくるかもしれません。そのような場合にはマニュアルモックが使えます。マニュアルモックマニュアルモックは、テストファイルと同じ階層に__mocks__/cross-fetch.jsのように__mocks__/の中にモジュール名ファイルを入れることで、jest.mock('cross-fetch')時にそのファイルに書かれた内容でモック化してくれる機能です。先程のcross-fetchと同様のマニュアルモックを作ると以下のようになります。}])が返されるようになりました。先程出てきたmockResolvedValueOnce(value)は「1度だけPromise.resolve(value)を返す」という関数にするものでしたが、他にも色々あります。mockResolvedValue(value)は1度じゃなく常にPromise.resolve(value)を返すようにします。同じようにmockRejectedValue,mockRejectedValueOnceやmockReturnValueとmockReturnValueOnceがあり、それぞれPromise.reject(value)とvalue版です。完全に自分で実装するmockImplementation(fn)とmockImplementationOnce(fn)もあります。引数のfnは単なる関数で、モック関数が呼ばれた時に単にそれが呼ばれ結果が戻り値で返ります。モックは受け取った引数や戻り値を覚えています。それらはそれぞれmock.callsとmock.resultsを通して取得できます。mock.calls[0][1]で1回目実行時の第2引数、mock.results[0]で1回目実行時の戻り値のような感じです。上記のmock.callsやmock.resultsの履歴を消したい時はmockResetを実行します。mockClearを呼ぶとモックをjest.fn()直後の状態に戻せます。