Moq でメソッドを 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
});
これはうまくいきnew ValidUserContext()
ますが、ユーザー名またはパスワードが上記の変数username
と異なる場合はこれを返したいと思います。password
そのために、別のセットアップを追加しましたが、今回は上記のセットアップをオーバーライドし、常に適用します。
membershipServiceMock.Setup(ms =>
ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>())
).Returns(
new ValidUserContext()
);
Moqでこの種の状況を処理する最もエレガントな方法は何ですか?
編集
以下のアプローチで問題を解決しましたが、これを処理するより良い方法があると思います:
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()
);