多个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");