web-dev-qa-db-ja.com

モックとスタブ

私はモックとスタブが何であるかを本当に理解していません。テストケースでモックをいつ、なぜ、どのように使用するのか知りたいです。 RailsのRuby on Railsにモックとスタブ用の優れたフレームワークがあることは知っていますが、目的がわからないので、アプリでそれらを使用するのは気が進まないです。

モックとスタブについて明確にしていただけますか?助けてください。

30
Anand

私の非常に単純化された答えは次のとおりです。

  • モックは他のものと同様のインターフェースを持つオブジェクトです
  • スタブは偽のメソッドであり、特定の回答を返します

どちらも同じことを達成しようとしています。特定のユニット(モデル/ビュー/コントローラー/モジュール)を個別にテストしたいのです。例えば。コントローラをテストするときは、モデルをテストしたくないので、モックを使用します。正しいメソッドが呼び出されていることを確認する必要があります。 find。したがって、モックには、実際にデータベースにアクセスせずに、事前定義されたものを返すスタブがあります。

したがって、期待値をテストします。実際に呼び出すことなく、(他のユニットで)呼び出されると予想されるメソッドです。その特定の方法のテストは、それ自身のテストでカバーされるべきでした。

64
nathanvda

Fowlerの記事 モックはスタブではありません によると、スタブは外部呼び出しから独立した偽のメソッドですが、モックは呼び出しに対する事前にプログラムされた反応を持つ偽のオブジェクトです。

モックはより具体的でオブジェクトに関連しています:特定のパラメーターが渡されると、オブジェクトは特定の結果を返します。オブジェクトの動作は模倣または「モック」されます。

スタブはより一般的で、メソッドに関連しています。スタブされたメソッドは通常、すべてのパラメーターに対して常に同じ結果を返します。メソッドの動作は、フリーズ、缶詰、または「スタブ」されます。

15
0x4a6f4672

モックは、相互作用ベースのテストで動作を検証するために使用されます。モックを使用すると、テスト対象のメソッドが別のメソッドを呼び出したことを表明できます。たとえば、コントローラーオブジェクトがリポジトリを呼び出してデータを取得するようにしたい場合があります。

スタブは、特定のアプリケーション状態を設定するための状態ベースのテストで使用されます。モックとは異なり、電話がかけられたかどうかは気になりません。たとえば、リポジトリコードをテストしている場合は、スタブメソッドを設定して、データベース接続が閉じられたときにリポジトリがケースを正しく処理することを確認できます。

2
neontapir