C# ユニットテストでモックとフェイクをいつ使用すればよいですか? 質問する

C# ユニットテストでモックとフェイクをいつ使用すればよいですか? 質問する

モックと偽造を選択する理想的なシナリオ、つまり基本的なものを手動で設定することを提案するガイドラインを誰か考え出せるでしょうか?

この状況にどう対処したらよいか、少し混乱しています。

ベストアンサー1

さて、整理しなければならないことがいくつかあります。知っておく必要がある基本的なことが 2 つあります。それは、命名法とベスト プラクティスです。

まず最初に、優れたテスターである Roy Osherove による素晴らしいビデオ リソースを紹介します。

Roy Osherove によるユニットテストのレビュー

彼はまず、いくつかのオープンソース プロジェクトに同梱されているテスト ハーネスのレビューをいくつか行ったと述べています。それらのレビューは、次の場所にあります。http://weblogs.asp.net/rosherove/archive/tags/TestReview/default.aspx

これらは基本的にビデオレビューであり、テストハーネスを順を追って説明し、良い点と悪い点を教えてくれます。非常に役立ちます。

ロイには、とても良い本もあるようです。

命名法

このポッドキャストは役に立つだろう非常に:http://www.hanselminutes.com/default.aspx?showID=187

ただし、ポッドキャストを言い換えると (Hanselminutes のイントロ ミュージックはひどいです)、

基本的に、分離フレームワーク(Moq、Rhino Mocks、Type Mockなど)は、偽物

偽物テスト中に使用されるオブジェクトで、テスト対象のコードが本番コードの代わりに呼び出すことができます。フェイクは、テスト対象のコードをアプリケーションの他の部分から分離するために使用されます。

偽物には(主に)2つの種類があります:スタブそしてモック

モックこれは、テスト対象のコードがこれを呼び出して、正しいパラメータで呼び出しが行われたことをアサートできるように配置したフェイクです。以下のサンプルは、Moq 分離フレームワークを使用してこれを行います。

[TestMethod]
public void CalculateTax_ValidTaxRate_DALCallIsCorrect()
{
    //Arrange
    Mock<ITaxRateDataAccess> taxDALMock = new Mock<ITaxRateDataAccess>();
    taxDALMock.Setup(taxDAL => taxDAL.GetTaxRateForZipCode("75001"))
                  .Returns(0.08).Verifiable();

    TaxCalculator calc = new TaxCalculator(taxDALMock.Object);

    //Act
    decimal result = calc.CalculateTax("75001", 100.00);

    //Assert
    taxDALMock.VerifyAll();
}

スタブは、テストするコードが呼び出しから一貫したデータを返すことを確認するために配置することを除いて、モックとほぼ同じです (たとえば、コードがデータ アクセス レイヤーを呼び出す場合、スタブは偽のデータを返します)。ただし、スタブ自体に対してはアサートしません。つまり、メソッドが偽のデータ アクセス レイヤーを呼び出したことを確認する必要はありません。別のものをテストしようとしているのです。スタブを提供するのは、テストしようとしているメソッドが独立して動作するようにするためです。

スタブの例を次に示します。

[TestMethod]
public void CalculateTax_ValidTaxRate_TaxValueIsCorrect()
{    
    //Arrange
    Mock<ITaxRateDataAccess> taxDALStub = new Mock<ITaxRateDataAccess>();
    taxDALStub.Setup(taxDAL => taxDAL.GetTaxRateForZipCode("75001"))
                  .Returns(0.08);

    TaxCalculator calc = new TaxCalculator(taxDALStub.Object); 

    //Act
    decimal result = calc.CalculateTax("75001", 100.00);

    //Assert
    Assert.AreEqual(result, 8.00);
}

ここでは、メソッドが別のリソースを呼び出したという事実ではなく、メソッドの出力をテストしていることに注意してください。

Moq では、実際にはモックとスタブの API を区別しません (両方とも として宣言されていることに注意してくださいMock<T>) が、ここでの使用法は型を決定する上で重要です。

これがあなたの理解に役立つことを願っています。

おすすめ記事