2013-02-15 16 views
9

私はちょうど読み始めましたProfessional Test Driven Development with C#: Developing Real World Applications with TDDスタブ、偽物、モックを理解する。

私はスタブ、偽物とモックを理解するのは難しいです。私がこれまで理解してきたことは、あなたのプロジェクトを単体テストする目的で使用される擬似オブジェクトであり、モックはその中に条件付きロジックを持つスタブです。

私が選んだと思うもう一つのことは、モックは何らかの形で依存性注入と関連しているということです。これは、私が昨日理解できた概念です。

私は実際にそれらを使用する理由はありません。私は彼らを適切に説明する具体的な例をオンラインで見つけることはできない。

誰でもこの概念を私に説明できますか?

+2

読むこのhttp://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.htmlこのhttp://martinfowler.com/articles/mocksArentStubs.html – blank

+1

そして、あなたがでている間それを読んでいるかもしれません。http://www.mockobjects.com/files/mockrolesnotobjects.pdf – blank

+0

私はあなたが商業を赦してくれることを願っていますが、私たちは「Growing Object Oriented Software」という本を書いています。モックを使って –

答えて

19

私が過去に読んだように、ここで私は、各用語は

の略信じるものスタブ

ここであなただけできるように、既知の値にメソッドの結果をスタブされていますコードは問題なく実行されます。たとえば、次のように指定します:

public int CalculateDiskSize(string networkShareName) 
{ 
    // This method does things on a network drive. 
} 

このメソッドの戻り値が何であるかは関係ありませんが、関係はありません。さらに、ネットワークドライブが利用できない場合に実行されると例外が発生する可能性があります。したがって、このメソッドの潜在的な実行の問題を回避するために、結果をスタブします。あなたが偽のデータを返す、またはオブジェクトの偽のインスタンスを作成している偽のでは

sut.WhenCalled(() => sut.CalculateDiskSize()).Returns(10); 

フェイク:

は、だからあなたのような何かをやってしまいます。典型的な例は、リポジトリクラスです。この方法を取る:

public int CalculateTotalSalary(IList<Employee> employees) { } 

通常、上記の方法には、データベースから読み取った従業員のコレクションが渡されます。しかし、単体テストではデータベースにアクセスしたくありません。あなたは、この場合には、総給与をfakeEmployeesに項目を追加し、期待される結果を主張することができます

IList<Employee> fakeEmployees = new List<Employee>(); 

:だから、偽の従業員のリストを作成します。

モック

をモックオブジェクトを使用して、あなたはそれらのモックオブジェクト上のいくつかの行動、またはデータを、検証していきます。例:あなたは具体的な方法は、テスト実行中に実行されたことを確認したい

、ここでは部品番号モックフレームワークを使用して、一般的な例です:

public void Test() 
{ 
    // Arrange. 
    var mock = new Mock<ISomething>(); 

    mock.Expect(m => m.MethodToCheckIfCalled()).Verifiable(); 

    var sut = new ThingToTest(); 

    // Act. 
    sut.DoSomething(mock.Object); 

    // Assert 
    mock.Verify(m => m.MethodToCheckIfCalled()); 
} 

うまくいけば、上記のは、物事を少し明確にするのに役立ちます。

EDIT: Roy OsheroveはTest Driven Developmentの有名な提唱者であり、トピックに関する非常に良い情報があります。あなたはそれが非常に便利見つけることがあります。

http://artofunittesting.com/

+0

非常に有益です。私はいつも偽物とモックが交換可能だと思った。私は毎日新しいものをここで学ぶ:) +1 – bas

+0

モックでは何ですか?私たちはテストしているクラスですか? – fersarr

+0

'm'は' Expect() '関数に渡されるパラメータです。ラムダ式です。どこでも宣言されておらず、 'Expect()'ラムダの内部に存在するだけです。 'var mock = new Mock ();'はあなたが 'ISomething'を実装するオブジェクトを作成していることを意味します。したがって、' ISomething'はオブジェクトではなくインターフェースです。メソッドを呼び出すときにメソッドがどのように応答するかを制御するには、 'Mock'を使用します。たとえば、' Expect() '関数を使用します。 –

0

このPHPユニットのマニュアルを紹介として私をたくさん助けた:

「それが依存しているため時にはテスト(SUT)の下でシステムをテストするために、単なる難しいですテスト環境で使用することができない他のコンポーネントについては、使用できない、テストに必要な結果を返さない、または実行すると望ましくない副作用が発生する可能性があります。私たちはSUTの内部的な振る舞いをより詳細に制御したり可視化したりすることができます。 More:https://phpunit.de/manual/current/en/test-doubles.html

また、模擬、偽物、スタブなどが知られているので、「テスト倍精度」を探していると、「紹介」がよくわかります。

3

これらはすべてTest Doubleのバリエーションです。ここでは、それらの間の違いを説明し、非常に良いの参照です:http://xunitpatterns.com/Test%20Double.html

また、Martin Fowler氏のポストから:http://martinfowler.com/articles/mocksArentStubs.html

Meszarosは使用 ふりオブジェクトの任意の種類の総称として、用語のテストダブルを使用していますテスト目的のための実際のオブジェクトの代わりに。 名前は映画のスタントダブルの概念から来ています。 ( 彼の目的の一つは、既に広く使用された任意の名前を使用しないようにしました。) Meszarosは、その後、二重の4特定の種類の定義された:

  1. ダミーオブジェクト:周りに渡されるのが、実際に使用されることはありません。通常は はパラメータリストを埋めるために使用されます。
  2. 偽のオブジェクトは実際に実装されていますが、通常は をプロダクションには適していないようなショートカットをとっています(メモリデータベースでは の例)。
  3. スタブは、テスト中に行われたコールに缶詰の応答を提供します。 は通常、テストのために にプログラムされたもの以外のものにはまったく応答しません。スタブには、 などの通話に関する情報が記録され、「送信された」メッセージが記憶されているメールゲートウェイスタブや、「送信されたメッセージ数」は などと記録されます。
  4. モックはここで話しているものです。オブジェクトは、期待されるコールで指定された という形式の期待値であらかじめプログラムされています。

これらの種類のダブルのうち、モックのみが動作確認を主張しています。 その他のダブルスは、通常は状態確認を行うことができます。モック は、実際には という具合に、実際の コラボレーターと話しているとSUTに言わせる必要があるため、エクササイズフェーズで他のダブルスと同じように動作します。

関連する問題