2012-10-13 4 views
25

Moqを使用してメソッドを2回セットアップしたいと思いますが、最後のメソッドが前のものをオーバーライドしているようです。ここに私の最初のセットアップです:モックで異なるパラメータに対してメソッドを2回セットアップする方法

string username = "foo"; 
string password = "bar"; 

var principal = new GenericPrincipal(
    new GenericIdentity(username), 
    new[] { "Admin" }); 

var membershipServiceMock = new Mock<IMembershipService>(); 
membershipServiceMock.Setup(ms => 
    ms.ValidateUser(username, password) 
).Returns(new ValidUserContext { 
    Principal = principal 
}); 

これは罰金うまくいくが、私は、ユーザー名またはパスワードが上記のようにusernamepassword変数ではなく、ある場合、これはnew ValidUserContext()を返すようにしたいです。これを行うには、私は別の設定を追加しましたが、今回はそれが上記のいずれかをオーバーライドして、常にそれを適用します。

membershipServiceMock.Setup(ms => 
    ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>()) 
).Returns(
    new ValidUserContext() 
); 

部品番号を持つ状況のこのタイプを扱うの最もエレガントな方法は何ですか?

編集

私は、以下の方法の問題点を解決するが、私はこれを処理するより良い方法があると思います。

var membershipServiceMock = new Mock<IMembershipService>(); 
membershipServiceMock.Setup(ms => 
    ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>()) 
).Returns<string, string>((u, p) => 
    (u == username && p == password) ? 
    new ValidUserContext { 
     Principal = principal 
    } 
    : new ValidUserContext() 
); 

答えて

35

部品番号は、引数の制約を箱から取り出し、これをサポートしています。

mock.Setup(ms => ms.ValidateUser(
     It.Is<string>(u => u == username), It.Is<string>(p => p == password)) 
    .Returns(new ValidUserContext { Principal = principal }); 
mock.Setup(ms => ms.ValidateUser(
     It.Is<string>(u => u != username), It.Is<string>(p => p != password)) 
    .Returns(new ValidUserContext()); 

キャッチオールIt.IsAnyでも動作しますが、しかし、順序は重要です:ボックスのオプションのうち

// general constraint first so that it doesn't overwrite more specific ones 
mock.Setup(ms => ms.ValidateUser(
     It.IsAny<string>(), It.IsAny<string>()) 
    .Returns(new ValidUserContext()); 
mock.Setup(ms => ms.ValidateUser(
     It.Is<string>(u => u == username), It.Is<string>(p => p == password)) 
    .Returns(new ValidUserContext { Principal = principal }); 
+1

最初の解決策は、u == usernameとp!= passwordの場合は処理しませんか? –

2

もう一つは、パラメータに応じて異なるValidUserContextsを返すためにリターン<>バージョンを使用することです。上記の答えよりも優れているわけではなく、もう一つの選択肢です。

GetUserContext(string、string)関数の結果を返し、ValidateUser()が呼び出されたユーザー名とパスワードを渡すために、ValidateUser()を設定しました。

関連する問題