2016-04-17 5 views
2

Moqの設定にパラメータを渡すときは、そのパラメータを別に取得するのではなく、It.Is <>それを「普通の」方法で渡しますか?これまでのテストのニーズは限定されていた可能性がありましたが、私はそれを使用する必要はありませんでした。<> mockの外では定義できませんでした。セットアップ?それは私がソースを見ているときに、またそのような基本的な例のために非常に一般的に見えるので、どのような利点があるのだろうかと思います。以下は簡潔さのための簡単な例ですが、私はそれを見越した他のケースでも何の違いもありませんでした。私は意味:それは短いほど、私はいつも最初のアプローチを使用することになりMoq - それを使用する。パラメータを渡すときはそれを使用するかvを使用しない場合

mockRepo.Setup(m => m.GetAllReadingsOn 
(It.Is<DateTime>(d => d ==_latestDate))) 
.Returns(_filteredReadings); 
+0

具体的な値を使用すると、あなたは、この具体的な値への呼び出しを制限する意味。一方、複数の(または任意の)値にマッチすることができます。率直に言えば、具体的な値は頻繁には使用されず、「平易な方法で取得して渡す」ことによって理解できる内容について詳しく説明することができます。 –

+0

'd => d == _ latestDate'は非常に基本的な例です。あなたはここでもっと興味深いことをすることができます... – wimh

答えて

3

mockRepo.Setup(m =>m.GetAllReadingsOn 
(latestDate) 
.Returns(_filteredReadings); 

対。 1つの例外があります。テスト対象のメソッドがそれらを作成するため、比較できない参照型です。この場合、あなたはこの方法で作成されたことを確認するために、プロパティでプロパティを比較する必要があり、正しい参照型を渡されます

mockRepo.Setup(m => m.GetAllReadingsOn(It.Is<SomeComplexObject>(x => 
    x.Foo == "foo" && 
    x.Bar == "bar" && 
    x.Baz == 123))) 
.Returns(_filteredReadings); 

これビーイングは、日付時刻などの値型で、このアプローチを使用すると、キーストロークの完全な廃棄物であると述べました。


コメント欄には、最初のアプローチがうまくいかない場合の基本的な例があります。あなたは、次のテストを記述しようとした場合、それは無残に失敗します今、明らかに

public SomeResult FooBarBaz() 
{ 
    var myModel = new SomeComplexObject(); 
    myModel.Foo = "foo"; 
    myModel.Bar = "bar"; 
    myModel.Baz = 123; 
    var result = repository.GetTheResult(myModel); 

    return result; 
} 

:私たちは、次のメソッドをテストしたいとし

// arrange 
var sut = new Sut(); 
var myModel = new SomeComplexObject(); 
myModel.Foo = "foo"; 
myModel.Bar = "bar"; 
myModel.Baz = 123; 
var expected = new SomeResult(); 
mockRepo 
    .Setup(m => m.GetAllReadingsOn(myModel) 
    .Returns(expected); 

// act 
var actual = sut.FooBarBaz(); 

// assert 
Assert.AreEqual(expected, actual); 
+0

ダーリンに感謝します。最初のアプローチがうまくいかないときに基本的な例を共有できますか? – Turo

+0

もちろん、基本的な例で私の答えを更新してください。 –

関連する問題