嘲笑する目的は何ですか?
テストに NUnit を使用し、モックに Moq を使用するいくつかの ASP.NET MVC チュートリアルに従っています。ただし、その嘲笑の部分については少しわかりません。
嘲笑する目的は何ですか?
テストに NUnit を使用し、モックに Moq を使用するいくつかの ASP.NET MVC チュートリアルに従っています。ただし、その嘲笑の部分については少しわかりません。
モックの目的は、テスト対象のクラスを他のクラスから分離することです。
これは、クラスが次の場合に役立ちます。
また、モックオブジェクトを構築してエラーを返し、例外をスローするため、エラー状態のテストが容易になります...
モックは呼び出された方法 (関数呼び出しの順序、パラメーター) を記録でき、これはテストで検証できます。編集:例: テストしているメソッドは、IPC などのメッセージを送信します。モック オブジェクトのメソッドは、呼び出された回数、受け取ったパラメーター (つまり、送信されるメッセージ) を記録できます。次に、テストはモック オブジェクトに問い合わせて、送信されたメッセージの数、メッセージの内容をアサートできます。同様に、モック オブジェクトは呼び出されたメソッドをログ文字列に記録し、テストはその文字列を取得してアサートできます。その上で。
モック オブジェクトを悪用しないでください。実装ではなく動作をテストしてください。そうしないと、単体テストがコードに密接に結び付きすぎて、もろくなります (リファクタリングで壊れます)。
モックは、手動でコーディングすることも、モックフレームワークによって生成することもできます。
モッキングを使用すると、テスト対象のクラスをその依存関係から分離できます。一般に、テスト対象のクラスの依存関係ごとにモックを作成し、期待値を返すようにモックを設定します。次に、テスト対象のクラスが依存しているクラスの実際のコピーではなく、テスト対象のクラスにモックを提供します。その後、モック フレームワークを使用して、期待される呼び出しがモック オブジェクトに対して行われたことを確認し、テスト対象のクラスが正しく動作していることを確認できます。
グループ コレクションの個々のインスタンスをからかうように設計されています。イレギュラーなオブジェクトの集まりでよく使われます。
モックは通常、テスト対象のクラスを分離できると理解されていますが、これはモックの主なポイントではありません (これにはスタブの方が適しています)。代わりに、オブジェクトが 3 つのことのうちの 1 つを実行するように指示されたときに何が起こるかを調べる必要があります。
状態ベースのテストは、すべて #1 と #2 に関するものです。#1メソッドが提供する結果を見ることによる。#2 オブジェクトの内部状態にアクセスする。
これにより、#3 が残ります。これには 2 つの方法があります。1 つ目はモックを使用する方法で、2 つ目はテスト スパイを使用する方法です。主な違いは、モックではテスト対象のコードを実行する前に期待値を作成し、その後モックにそれらを検証させるのに対し、テスト スパイではテスト対象のコードを実行してから、特定のアクションが発生したかどうかをテスト スパイに尋ねることです。
以上をまとめると、間接出力 (別のクラスへの呼び出し) をテストする必要がある場合にクラスが何をするかをテストすることを考えると、そこでモックが登場します。
私も嘲笑するのは初めてですが、これを試してみます。私の経験では、モックには主に 2 つの利点があります。
「モック」は、テストおよび TDD サークルでは非常に過負荷な用語です。Martin Fowler の記事Mocks Arent Stubsを参照してください。「適切な」モックは、受け取るべき値を認識しており、意図した値が得られない場合は通知します。これにより、状態テストの代わりに相互作用テストを行うことができます。テスト対象のクラスが正しいメッセージを正しい順序でコラボレータに渡していることを確認します。相互作用テストは、従来の状態テストとはかなり異なり、理解するのが難しい場合があります。インタラクション テストがモックのポイントであることを念頭に置くと、モックが理解しやすくなる場合があります。
もう1つの答え:
スタブ = 実際のコンテキスト全体なしでテストを実行できるようにするための偽のオブジェクト
モック = コンポーネントの相互作用を記録し、これらの相互作用を検証するための偽のオブジェクト
1 つのテストで複数のスタブを使用できますが、モックは 1 つしか使用できません。これは、複数のモックを使用すると、複数の機能を確実にテストすることになるためです (そして、1 つのことをテストするという原則の目的に反します)。
基本を超えて、モックは、コンポーネントに作用した後にコンポーネントの状態を確認する従来のテストの状態検証よりも動作の検証です (アレンジ、アクト、モックでアサート、よりアレンジ、アクト、検証) :
状態の検証 Assert.AreEqual(valueExpected,mycomponent.Property); 動作検証: myMock.WasCalled(MyMethod);