C# 最小起订量设置和关闭

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

使用Moq,我试图设置一个方法,根据参数返回一些内容。 所以,如果你通过argument1,你会得到result1,如果你通过argument2,你会得到result2:

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:参数计数不匹配。
编辑以考虑第一个参数。