2016-09-01 3 views
1

好きな場合、2つの設定が交差したり重なったりするとどうなりますか?MOQメソッドの設定が交差するとどうなりますか?

たとえば、明らかに"aSpecificString"は任意の文字列と見なされるため、以下のシナリオではセットアップの重複が発生します。

Interface ISomeInterface 
{ 
    int SomeMethod(string param); 
} 

[TestMethod] 
public void SomeClass_ShouldBehaveProperly_GivenSomeScenario() 
{ 
    var mock = new Mock<ISomeInterface>(MockBehavior.Strict); 
    mock.Setup(m => m.SomeMethod("aSpecificString")) 
     .Returns(100); 
    mock.Setup(m => m.SomeMethod(It.IsAny<string>())) 
     .Returns(0); 

    /*the rest of the test*/ 
} 

交差するとどうなるのだろうか。

例外をスローするか、重複を検出して最初に一致するセットアップを追加した順に使用しませんか?

セットアップが重複しないようにすることをお勧めします。

+0

...あなたは重要なコードを下ろし始めた前に私はあなたに到達するために管理したいと考えています。最後のコールが勝ち、以前のコールを無効にします。 – Nkosi

答えて

2

オンラインで見つかったドキュメントによると、前回のコールで勝って以前のコールが無効になります。

テストが

SomeMethod("aSpecificString") 

を呼び出すことだったのであればもあなたの場合には、それはあなたの例では、セットアップに基づいて0を返します。

+0

私はいくつかのテストを行いました。重複した値が与えられると、最後に重複した設定が使用されます。 – AXMIM

5

あなたが行っているパスを下ってはいけません。私は腹痛と腹痛だけを見ます。代わりに、あなたのReturn条件ます

mock.Setup(m => m.SomeMethod(It.IsAny<string>())) 
    .Returns((string parameter) => parameter == "aSpecificString" ? 100 : 0); 

私はマニュアルに従って

+0

は、条件付きリターンを示すために投票されました。 (そして、パスについての警告。笑) – Nkosi

+0

興味深いことに、私がそこに行った理由は、私が嘲笑したインターフェースの性質によるものです。これはフォーミュラエンジンのインターフェースであり、模擬メソッドは「評価」されています。数式ごとにセットアップを行うのが自然だと思われますが、正しいです。3つまたは4つの可能な式の代わりに、代わりに「スイッチケース」を実行できました。 – AXMIM

+0

いくつかのテストでは、数式とその引数の組み合わせのための具体的な設定を行ったが、これにより、特定のシナリオを気にすることができました。これにより、他のシナリオが発生した場合、期待どおりにテストが失敗することがあります。また、複数の引数があるため、スイッチは "if {} else if {else else if {throw}"文に変換する必要があります。これはこのケースでは面倒です。予期しない引数があった場合は明示的にスローする必要があります。 – AXMIM

関連する問題