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)