9

C# を使用した Professional Test Driven Development: Developing Real World Applications with TDDを読み始めたところです。

スタブ、フェイク、モックを理解するのに苦労しています。私がこれまでに理解していることから、それらはプロジェクトの単体テストの目的で使用される偽のオブジェクトであり、モックは条件付きロジックを含むスタブです。

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

私が得られないのは、実際にそれらを使用する理由です。それらを適切に説明する具体的な例をオンラインで見つけることができないようです。

誰かが私にこの概念を説明してもらえますか?

4

3 に答える 3

22

私が過去に読んだように、各用語が何を表していると私が信じているかを以下に示します。

スタブ

ここでは、問題なくコードを実行できるようにするために、メソッドの結果を既知の値にスタブしています。たとえば、次のものがあったとします。

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) { }

通常、上記のメソッドには、データベースから読み取られた従業員のコレクションが渡されます。ただし、単体テストでは、データベースにアクセスしたくありません。したがって、偽の従業員リストを作成します。

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

その後、項目を fakeEmployees に追加して、期待される結果 (この場合は総給与) をアサートできます。

モック

モック オブジェクトを使用する場合、それらのモック オブジェクトの動作またはデータを検証するつもりです。例:

テスト実行中に特定のメソッドが実行されたことを確認したい場合は、Moq モック フレームワークを使用した一般的な例を次に示します。

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());
}

上記が物事を少し明確にするのに役立つことを願っています。

編集: Roy Osherove は、テスト駆動開発の支持者としてよく知られており、このトピックに関する非常に優れた情報を提供しています。あなたはそれが非常に便利だと思うかもしれません:

http://artofunittesting.com/

于 2013-02-15T10:07:43.103 に答える