Moqで、複数の一致する引数を持つことは有効ですか?
It.Is<string>()
この例では、提供されたユーザーに応じてmockMembershipServiceが異なるProviderUserKeyを返すようにします。
mockMembershipService.Setup(
x => x.GetUser(
It.Is<string>(
s => s.Contains("Joe")))
.ProviderUserKey)
.Returns("1234abcd");
mockMembershipService.Setup(
x => x.GetUser(
It.Is<string>(
s => s.Contains("Tracy")))
.ProviderUserKey)
.Returns("5678efgh");
SetUpは、それぞれのメリットを評価するのではなく、デフォルトで2番目のステートメントを使用します。
混乱しませんか? GetUserメソッドをモックしようとしていますが、その関数の戻り値のプロパティにReturnを設定しています。また、モックメソッドに基づいて戻り値の型のプロパティを記述することもできます。
より明確な方法は次のとおりです。
mockMembershipService.Setup(x => x.GetUser(It.IsAny<string>())
.Returns<string>(GetMembershipUser);
メンバーシップモックを作成する方法は次のとおりです。
private MembershipUser GetMembershipUser(string s)
{
Mock<MembershipUser> user =new Mock<MembershipUser>();
user.Setup(item => item.ProviderUserKey).Returns(GetProperty(s));
return user.Object;
}
次に、そのプロパティを設定するメソッドを記述します。
private string GetProperty(string s)
{
if(s.Contains("Joe"))
return "1234abcd";
else if(s.Contains("Tracy"))
return "5678efgh";
}
入力を「Joe」と「Tracy」のみに制限する場合は、It.Is<T>()
で複数の条件を指定できます。何かのようなもの
mockMembershipService.Setup(x => x.GetUser(It.Is<String>(s => s.Contains("Joe")
|| s.Contains("Tracy")))
.Returns<string>(/* Either Bartosz's or Ufuk's answer */);
連続セットアップ呼び出しは、以前のセットアップを無効にします。
リターンコールバックで引数を使用できます。
_mockMembershipService.Setup(x => x.GetUser(It.IsAny<string>()).ProviderUserKey).Returns<string>(s =>
{
if(s.Contains("Joe"))
return "1234abcd";
else if(s.Contains("Tracy"))
return "5678efgh";
});
_
渡された引数をアサートすることが重要な場合は、It.Is<string>(...)
の代わりにIt.IsAny<string>(...)
も必要です。
Moqの紹介>一致する引数 ドキュメントを確認してください:
// matching Func<int>, lazy evaluated
mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true);
// matching ranges
mock.Setup(foo => foo.Add(It.IsInRange<int>(0, 10, Range.Inclusive))).Returns(true);
// matching regex
mock.Setup(x => x.DoSomething(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");