7

嘲笑する目的は何ですか?

テストに NUnit を使用し、モックに Moq を使用するいくつかの ASP.NET MVC チュートリアルに従っています。ただし、その嘲笑の部分については少しわかりません。

4

8 に答える 8

17

モックの目的は、テスト対象のクラスを他のクラスから分離することです。

これは、クラスが次の場合に役立ちます。

  • 外部リソース (ファイルシステム、DB、ネットワークなど) に接続します
  • セットアップに費用がかかるか、まだ利用できない (ハードウェアは開発中)
  • 単体テストの実行が遅くなる
  • 非決定的な振る舞いをする
  • ユーザーインターフェースを持っている(または持っている)

また、モックオブジェクトを構築してエラーを返し、例外をスローするため、エラー状態のテストが容易になります...

モックは呼び出された方法 (関数呼び出しの順序、パラメーター) を記録でき、これはテストで検証できます。編集:例: テストしているメソッドは、IPC などのメッセージを送信します。モック オブジェクトのメソッドは、呼び出された回数、受け取ったパラメーター (つまり、送信されるメッセージ) を記録できます。次に、テストはモック オブジェクトに問い合わせて、送信されたメッセージの数、メッセージの内容をアサートできます。同様に、モック オブジェクトは呼び出されたメソッドをログ文字列に記録し、テストはその文字列を取得してアサートできます。その上で。

モック オブジェクトを悪用しないでください。実装ではなく動作をテストしてください。そうしないと、単体テストがコードに密接に結び付きすぎて、もろくなります (リファクタリングで壊れます)。

モックは、手動でコーディングすることも、モックフレームワークによって生成することもできます。

于 2009-06-16T15:46:45.163 に答える
7

モッキングを使用すると、テスト対象のクラスをその依存関係から分離できます。一般に、テスト対象のクラスの依存関係ごとにモックを作成し、期待値を返すようにモックを設定します。次に、テスト対象のクラスが依存しているクラスの実際のコピーではなく、テスト対象のクラスにモックを提供します。その後、モック フレームワークを使用して、期待される呼び出しがモック オブジェクトに対して行われたことを確認し、テスト対象のクラスが正しく動作していることを確認できます。

于 2009-06-16T15:39:20.763 に答える
4

グループ コレクションの個々のインスタンスをからかうように設計されています。イレギュラーなオブジェクトの集まりでよく使われます。

于 2009-06-16T15:55:17.250 に答える
4

モックは通常、テスト対象のクラスを分離できると理解されていますが、これはモックの主なポイントではありません (これにはスタブの方が適しています)。代わりに、オブジェクトが 3 つのことのうちの 1 つを実行するように指示されたときに何が起こるかを調べる必要があります。

  1. 直接出力 - メソッド呼び出しの結果
  2. 内部変更 - メソッド呼び出し中のクラスへの変更
  3. 間接出力 - テスト中のコードが別のクラスを呼び出す

状態ベースのテストは、すべて #1 と #2 に関するものです。#1メソッドが提供する結果を見ることによる。#2 オブジェクトの内部状態にアクセスする。

これにより、#3 が残ります。これには 2 つの方法があります。1 つ目はモックを使用する方法で、2 つ目はテスト スパイを使用する方法です。主な違いは、モックではテスト対象のコードを実行する前に期待値を作成し、その後モックにそれらを検証させるのに対し、テスト スパイではテスト対象のコードを実行してから、特定のアクションが発生したかどうかをテスト スパイに尋ねることです。

以上をまとめると、間接出力 (別のクラスへの呼び出し) をテストする必要がある場合にクラスが何をするかをテストすることを考えると、そこでモックが登場します。

于 2009-06-16T15:58:18.297 に答える
3

私も嘲笑するのは初めてですが、これを試してみます。私の経験では、モックには主に 2 つの利点があります。

  • 実際に実装を記述する前に、オブジェクトの操作を開始できます。インターフェイスを定義し、モッキングを使用して、単体テストまたはコードでインターフェイスを操作できます。
  • モッキングを使用すると、単体テストでテスト対象のオブジェクトを分離できます。モック オブジェクトを使用すると、テスト対象のオブジェクトが対話するすべてのオブジェクトを完全に制御できるため、テストから外部依存関係を取り除くことができます。
于 2009-06-16T15:39:08.343 に答える
3

「モック」は、テストおよび TDD サークルでは非常に過負荷な用語です。Martin Fowler の記事Mocks Arent Stubsを参照してください。「適切な」モックは、受け取るべき値を認識しており、意図した値が得られない場合は通知します。これにより、状態テストの代わりに相互作用テストを行うことができます。テスト対象のクラスが正しいメッセージを正しい順序でコラボレータに渡していることを確認します。相互作用テストは、従来の状態テストとはかなり異なり、理解するのが難しい場合があります。インタラクション テストがモックのポイントであることを念頭に置くと、モックが理解しやすくなる場合があります。

于 2009-06-16T15:47:13.227 に答える
0

もう1つの答え:

  • スタブ = 実際のコンテキスト全体なしでテストを実行できるようにするための偽のオブジェクト

  • モック = コンポーネントの相互作用を記録し、これらの相互作用を検証するための偽のオブジェクト

1 つのテストで複数のスタブを使用できますが、モックは 1 つしか使用できません。これは、複数のモックを使用すると、複数の機能を確実にテストすることになるためです (そして、1 つのことをテストするという原則の目的に反します)。

基本を超えて、モックは、コンポーネントに作用した後にコンポーネントの状態を確認する従来のテストの状態検証よりも動作の検証です (アレンジ、アクト、モックでアサート、よりアレンジ、アクト、検証) :

状態の検証 Assert.AreEqual(valueExpected,mycomponent.Property); 動作検証: myMock.WasCalled(MyMethod);

于 2009-06-23T00:56:18.857 に答える