C# 最小起订量设置:传递值或它的能力。IsAny<;T>;()视情况而定

C# 最小起订量设置:传递值或它的能力。IsAny<;T>;()视情况而定,c#,moq,C#,Moq,[问题与此类似:-需要进一步澄清] 短版 (更多定义见下文) 我的情况是,我需要在工厂中设置模拟。根据值的不同,我想在使用它或it.IsAny()之间进行选择 这就是我(天真地)想要做的: moq.Setup(() => mockWebService.WebServiceMethod( webServiceMethodObject.Some ?? It.IsAny<string>(), // that fails ..., out webServiceM

[问题与此类似:-需要进一步澄清]

短版 (更多定义见下文)

我的情况是,我需要在工厂中设置模拟。根据值的不同,我想在使用它或
it.IsAny()
之间进行选择

这就是我(天真地)想要做的:

moq.Setup(() => mockWebService.WebServiceMethod(
    webServiceMethodObject.Some ?? It.IsAny<string>(), // that fails
    ...,
    out webServiceMethodObject.That,
    ...)).Returns(webServiceMethodObject.ReturnEnum);
我们需要太多的webservice方法调用,而且它们的参数太多,所以我们不得不将它们封装到对象中。 例如:

策略应该是这样的:我们正在创建此对象的默认版本。在测试中,我们填写需要匹配的值。我们希望将对象传递给一个待编写方法,该方法将相应地设置模拟:

如果设置了属性:使用该值


其他:使用
It.IsAny()
(请参阅上面的设置!)。

如果参数的逻辑非常复杂,您可以安全地对所有参数使用
It.IsAny
,并定义自定义委托来处理方法调用:

moq
    .Setup(() => WebServiceMethod(It.IsAny<string>(), It.IsAny<int>(), ...))
    .Returns((some, thing, ...) => {
        if (some == webServiceMethodObject.Some || webServiceMethodObject.Some == null) ...
        {
            return webServiceMethodObject.ReturnEnum;
        }
    });
moq
.Setup(()=>WebServiceMethod(It.IsAny(),It.IsAny(),…)
.Returns((某些、事物等)=>{
如果(some==webServiceMethodObject.some | | webServiceMethodObject.some==null)。。。
{
return webServiceMethodObject.ReturnEnum;
}
});
如果查看
返回
重载列表,您会发现有大量选项,“硬编码”
。返回(某些值)
只是其中之一


据我所知,传递给安装程序的整个过程是一个表达式树。Moq然后检查表达式子树中的参数。如果它们是基于
It
的表达式,则用于高级逻辑。如果不是,则对其进行评估,并将值与输入匹配。这可能是/你的天真版本不起作用的一个原因。

如果

webServiceMethodObject.Some ?? It.IsAny<string>()
webServiceMethodObject.Some??It.IsAny()
是你想要的但不起作用的,简单的替代就是

It.Is<string>(v =>
    webServiceMethodObject.Some == null ||
    webServiceMethodObject.Some == v)
It.Is(v=>
webServiceMethodObject.Some==null||
webServiceMethodObject.Some==v)

+1:实现相同功能的巧妙方法(只要逻辑只归结为
null
检查)!谢谢!我从没想过会这么容易!(我认为我们可能会对引用类型使用选项类型,而不是空检查,因为这对每个人来说都更清楚。)
webServiceMethodObject.Some ?? It.IsAny<string>()
It.Is<string>(v =>
    webServiceMethodObject.Some == null ||
    webServiceMethodObject.Some == v)