C# 最小起订量设置和关闭
使用Moq,我试图设置一个方法,根据参数返回一些内容。 所以,如果你通过argument1,你会得到result1,如果你通过argument2,你会得到result2:C# 最小起订量设置和关闭,c#,unit-testing,closures,moq,C#,Unit Testing,Closures,Moq,使用Moq,我试图设置一个方法,根据参数返回一些内容。 所以,如果你通过argument1,你会得到result1,如果你通过argument2,你会得到result2: var obj = ""; var propertyMock1 = new Mock<PropertyInfo>(); var propertyMock2 = new Mock<PropertyInfo>(); var result1 = ""; var result2 = ""; var fac
var obj = "";
var propertyMock1 = new Mock<PropertyInfo>();
var propertyMock2 = new Mock<PropertyInfo>();
var result1 = "";
var result2 = "";
var factoryMock = new Mock<IFactory>();
factoryMock.Setup(f => f.Create(obj, propertyMock1.Object)).Returns(result1);
factoryMock.Setup(f => f.Create(obj, propertyMock2.Object)).Returns(result2);
var obj=”“;
var propertyMock1=new Mock();
var propertyMock2=new Mock();
var result1=“”;
var result2=“”;
var factoryMock=new Mock();
Setup(f=>f.Create(obj,propertyMock1.Object)).Returns(result1);
Setup(f=>f.Create(obj,propertyMock2.Object)).Returns(result2);
但是,当我调用factoryMock.Object.Create(obj,propertyMock1.Object)
时,返回值是null
。
如果我传递了propertyMock2.Object
,它将按预期工作
我不知道为什么第一个设置不起作用
不过ReSharper给了我一些提示,我不明白。
在第一个设置中,它显示“隐式捕获的闭包:property2”,在第二个设置中,它显示“隐式捕获的闭包:property1”
为什么每个lambda都会捕获另一个lambda的论点?他们有什么关系?
为什么第一个设置不起作用?还有另一种方法可以设置模拟方法,以对不同的输入做出不同的反应:
var obj = "";
var propertyMock1 = new Mock<PropertyInfo>();
var propertyMock2 = new Mock<PropertyInfo>();
var result1 = "";
var result2 = "";
var factoryMock = new Mock<IFactory>();
factoryMock.Setup(f => f.Create(It.IsAny<string>(), It.IsAny<PropertyInfo>())).Returns<string, PropertyInfo>((s, pi) => {
if (pi == propertyMock1.Object)
return result1;
if (pi == propertyMock2.Object)
return result2;
});
// factoryMock.Setup(f => f.Create(obj, propertyMock2.Object)).Returns(result2);
var obj=”“;
var propertyMock1=new Mock();
var propertyMock2=new Mock();
var result1=“”;
var result2=“”;
var factoryMock=new Mock();
factoryMock.Setup(f=>f.Create(It.IsAny(),It.IsAny())。返回((s,pi)=>{
if(pi==propertyMock1.Object)
返回结果1;
if(pi==propertyMock2.Object)
返回结果2;
});
//Setup(f=>f.Create(obj,propertyMock2.Object)).Returns(result2);
我总是要提醒自己,还有其他类型的返回,包括泛型类型。您确定您与粘贴的代码完全相关吗?例如,代码中没有“property2”。如何调用
Create()
方法?被测试代码用两个不同的模拟值调用同一个模拟类似乎不太可能。您是否有以序列、数组或两个并排属性形式传递的构造函数注入?有关可能的解决方案,请参见下面的答案。@BartoszKP:my bad,我的意思是“propertyMock2”。@KeithPayne:被测试的类接受一个对象,读取其属性,然后使用工厂为每个属性创建另一个对象。当我实际调用创建方法时,会出现异常:System.Reflection.TargetParameterCountException:参数计数不匹配。
编辑以考虑第一个参数。