Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个最小起订量It.Is<;字符串>;()匹配参数_C#_Unit Testing_Mocking_Moq - Fatal编程技术网

C# 多个最小起订量It.Is<;字符串>;()匹配参数

C# 多个最小起订量It.Is<;字符串>;()匹配参数,c#,unit-testing,mocking,moq,C#,Unit Testing,Mocking,Moq,对于Moq,有多个匹配参数有效吗 It.Is<string>() It.Is() 在本例中,我希望mockMembershipService根据提供的用户返回不同的ProviderUserKey mockMembershipService.Setup( x => x.GetUser( It.Is<string>( s => s.Contains("Joe"))) .ProviderUserKey) .Return

对于Moq,有多个匹配参数有效吗

It.Is<string>() 
It.Is()
在本例中,我希望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");
mockMembershipService.Setup(
x=>x.GetUser(
是的(
s=>s.Contains(“乔”))
.ProviderUserKey)
.回报(“1234abcd”);
mockMembershipService.Setup(
x=>x.GetUser(
是的(
s=>s.Contains(“Tracy”))
.ProviderUserKey)
.返回(“5678efgh”);

安装程序默认使用第二条语句,而不是根据每个语句各自的优点进行评估。

后续安装程序调用“取消以前的设置”

您可以在返回回调中使用参数:

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";
});
mockMembershipService.Setup(x=>x.GetUser(It.IsAny()).ProviderUserKey)。返回(s=>
{
如果(s.包含(“Joe”))
返回“1234abcd”;
否则,如果(s.包含(“Tracy”))
返回“5678efgh”;
});

如果断言传递的参数对您来说很重要,那么您还需要
it.Is(…)
而不是
it.IsAny(…)

这难道不容易理解吗?您试图模拟GetUser方法,但设置了该函数返回值属性的返回值。您还需要基于mock方法声明返回类型的属性

这里有一个更清晰的方法:

mockMembershipService.Setup(x => x.GetUser(It.IsAny<string>())
                     .Returns<string>(GetMembershipUser);

如果要将输入限制为仅“Joe”和“Tracy”,可以在
It.Is()
中指定多个条件。差不多

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.Is(s=>s.Contains)(“Joe”)
||美国(简称“特蕾西”))
.返回(/*Bartosz或Ufuk的答案*/);
请检查文档:

// 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");
//匹配Func,已计算
mock.Setup(foo=>foo.Add(It.Is(i=>i%2==0))。返回(true);
//匹配范围
mock.Setup(foo=>foo.Add(It.IsInRange(0,10,Range.Inclusive))).Returns(true);
//匹配正则表达式
mock.Setup(x=>x.DoSomething(It.IsRegex(“[a-d]+”,RegexOptions.IgnoreCase)))。返回(“foo”);

我应该在大约2小时内尝试一下。啊,我想这是因为我们在这里设置了一个属性(
ProviderUserKey
),而我们试图采取行动的参数来自
GetUser(…)
。现在无法检查正确的解决方案,但如果您遵循Ufuk的建议,应该没问题……我将在周末试一试——谢谢您的帮助!不像我最初想的那样直截了当。@mattumotu:这不是我的经验,Moq只是有一个奇怪的执行策略。以后添加的安装调用将首先进行评估(或始终对所有项目进行评估并最终获胜)。这与预期正好相反:通常会返回第一个匹配项,而忽略其余匹配项。稍后将尝试此操作,当您添加答案时正在观看此视频,答案与此类似。上面的代码不会编译,它会抱怨安全性。MembershipUser不包含有关返回项的参考,也不包含有关U的参考ser不包含ProviderUserKey的定义我想你应该引用包含Security.MembershipUser的程序集。或者你可以在你的MembershipServicehmmm中为你创建用户注入依赖项-当我尝试我的方式时,它不会抱怨这一点-(当然,这不符合预期)我想您可以编写另一个函数来创建MembershipUser模拟,但它已经严重失控。我更新了代码。我并不想限制它本身,我只想评估输入并返回所需的输出:-)不管这是否在正确的位置,它都帮助了我,感谢@cadrell0Now在单元测试方面有更多的经验,我不推荐这种方法。我们应该避免将逻辑放在单元测试中。另一种选择是创建单独的单元测试:一个为Joe,另一个为Tracy
mockMembershipService.Setup(x => x.GetUser(It.Is<String>(s => s.Contains("Joe") 
                                                         || s.Contains("Tracy")))
    .Returns<string>(/* Either Bartosz's or Ufuk's answer */);
// 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");