多个Moq It.Is <string>()匹配的参数
用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默认为第二条语句,而不是根据自身的优点来评估每条语句。
难道不是吗? 您正试图模拟GetUser方法,但您为该函数的返回值的属性设置了返回值。 你也想基于模拟方法来表示返回types的属性。
这是一个更清晰的方式:
mockMembershipService.Setup(x => x.GetUser(It.IsAny<string>()) .Returns<string>(GetMembershipUser);
以下是创build成员资格模拟的方法:
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"; }
如果要将input限制为“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 */);
成功的安装程序调用取消以前的设置。
你可以在你的callback函数中使用你的参数:
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("[ad]+", RegexOptions.IgnoreCase))).Returns("foo");