モック関数
モック関数によりコード間の繋がりをテストすることができます。 関数が持つ実際の実装を除去したり、関数の呼び出し(また、呼び出しに渡されたパラメータも含め)をキャプチャしたり、new
によるコンストラクタ関数のインスタンス化をキャプチャできます。 そうすることでテスト時のみの返り値の設定をすることが可能になります。
関数をモックするには、次の2つの方法があります。 1つは、テストコードの中でモック関数を作成するという方法。 もう1つは、manual mock
を作成してモジュールの依存性を上書きするという方法です。
#
モック関数を利用するforEach
関数の実装をテストすることを考えてみましょう。 この関数は、与えられた配列の各要素に対して、コールバック関数を呼び出します。
この関数をテストするために、モック関数を利用して、コールバックが期待通り呼び出されるかを確認するためにモックの状態を検証することができます。
.mock
プロパティ#
すべてのモック関数には、この特別な .mock
プロパティがあり、モック関数呼び出し時のデータと、関数の返り値が記録されています。 .mock
プロパティには、各呼び出し時の this
の値も記録されているため、this
の値のチェックも可能です。
以下のモックのプロパティを使用すると、関数がどのように呼び出され、どのようにインスタンス化され、返り値が何であったのかを確認することができます。
#
モックの戻り値モック関数は、テスト中のコードにテスト用の値を注入するのにも利用できます。
モック関数は、関数的な継続渡し (continuation-passing) のスタイルを利用したコードでも、とても効果的です。 コードをこのスタイルで書くことで、本物のコンポーネントの振る舞いを再現するような複雑なスタブが必要になることを避けることができ、テストで使われる直前に値を直接注入するができるようになります。
実世界のほとんどの例では、依存しているコンポーネントのモック関数を見つけ出して構成することが必要となりますが、テクニック自体は一緒です。 こうしたテストを書く場合は、関数の内の直接テストされていないロジックを実装したくなる誘惑を避けるように努めましょう。
#
モジュールのモックAPI からユーザーを取得するクラスがあるとします。 以下のクラスは、axios を使用して API を呼び、全てのユーザーが持っている data
属性を返します。
さて、このメソッドを実際に API にアクセスせずにテストするために (もしそのようなテストを作れば、遅くて壊れやすいテストになってしまいます)、jest.mock(...)
関数を使えば、axios モジュールを自動的にモックすることができます。
一度モジュールをモックすれば、.get
に対して mockResolvedValue
メソッドを使えるようになり、テストで検証したいデータを返させるようにできます。 In effect, we are saying that we want axios.get('/users.json')
to return a fake response.
#
モックの実装とはいえ、指定された値を返すという能力を越えて完全に実装をモック化することが便利なケースがあります。 これはjest.fn
またはモック関数の mockImplementationOnce
メソッドを利用することで実現できます。
mockImplementation
メソッドは他のモジュールによって作成されたモック関数のデフォルトの実装を定義したいときに便利です。
関数への複数回への呼び出しで異なる結果を得るように複雑な挙動をするモック関数を再作成する必要がある場合はmockImplementationOnce
メソッドを使用して下さい。
モック関数がmockImplementationOnce
によって定義された実装が全て使い切った時は、 (もし定義されていれば) jest.fn
のデフォルトの実装を実行します。
よくチェーンされる(そしてのために常に this
を返す必要のある)メソッドがあるケースのために、この実装を単純化する糖衣APIを.mockReturnThis()
の形で全てのモックが備えています。
#
モック名You can optionally provide a name for your mock functions, which will be displayed instead of "jest.fn()" in the test error output. テスト結果でエラーを出力しているモック関数を迅速に特定したい場合に使用します。
#
カスタムマッチャ最後にモック関数がどのように呼ばれたかを検査する必要を減らすため、いくつかのカスタムマッチャを用意しておきました。
これらのマッチャは .mock
プロパティを検査する一般的な方法の糖衣構文です。 より好みに合うものが欲しい場合や、より特定のテストに向けたものが必要な場合は、いつでも手動でカスタムマッチャを追加することができます。
マッチャーの完全なリストについては、 リファレンスドキュメントを確認してください。