c#:为啥当我尝试在模拟中使用合并运算符时它不起作用

Posted

技术标签:

【中文标题】c#:为啥当我尝试在模拟中使用合并运算符时它不起作用【英文标题】:c#:Why when I try to use coalesce operator in a mock it doesn't workc#:为什么当我尝试在模拟中使用合并运算符时它不起作用 【发布时间】:2021-04-02 17:40:33 【问题描述】:

为什么当我尝试使用这样的模拟时:

public void Test(string param=null)
    MyMock.Setup(x=>x.foo(param ?? It.IsAny<string>));
 

这显然工作正常

public void Test(string param=null)
   if(param==null)
      MyMock.Setup(x=>x.foo(It.IsAny<string>));
   else
      MyMock.Setup(x=>x.foo(param));
 

但这是为什么呢? "param ?? It.IsAny" 返回 param 或 It.IsAny 我在这里缺少什么?

我看到了this 和this,但还是不明白。

【问题讨论】:

不确定这是否有帮助,因为我不使用起订量,但我尝试了以下操作,它按预期合并: List myValues = new List() 4, null , 1 ;字符串 Foo(int value) => value.ToString(); myValues.Select(x => Foo(x ?? 2)).ForEach(x => Console.WriteLine(x)); 【参考方案1】:

在 Moq 中设置 Mock 时,您实际上传递的不是函数参数的值(例如,tpye T),而是 Expression&lt;T&gt;,然后由 Moq 分析。 因此,当您传递值时,Moq 将对其进行分析并为使用该值的方法调用设置期望。 当你通过It.IsAny&lt;T&gt; Moq 将再次对其进行分析并设置期望,而无需任何参数。 但是当你传递你的param ?? It.IsAny&lt;string&gt; Moq 根本不知道如何分析它。

【讨论】:

同时我玩了它,发现如果我只是插入这样的函数:'Func f = ()=>param ?? It.IsAny();'到 'x.foo(f.Invoke())' 它工作正常。因此,如果我正确地得到它,第一个将评估留到以后并失败,而这个当场评估它?【参考方案2】:
MyMock.Setup(x=>x.foo(param==null ? It.IsAny<string>:param));

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。 试过了,没用,就像 DonaldDuck 说的我想了解原因。

以上是关于c#:为啥当我尝试在模拟中使用合并运算符时它不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 ListView 时,ListTile OnTap 正在工作。但是当我使用 ListWheelScrollView 它不起作用

当我尝试用 makefile 编译我的 qt 程序时它不起作用

如果无法识别,如何在游戏中模拟硬件鼠标点击?

iOS(5)模拟器上的当前位置不起作用?

使用 UITapGestureRecognizer 使键盘隐藏,当我在 UIButton 内触摸时它不起作用 [重复]

写了一个控制台应用程序来使用RestSharp来推送数据,但是当我尝试创建一个Windows服务时它不起作用