使用Moq,我正在尝试设置一个方法来根据参数返回一些东西。 所以,如果你传递argument1,你将得到result1,如果你传递参数2,你将得到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);
但是,当我致电factoryMock.Object.Create(obj, propertyMock1.Object)
时,返回值为null
。
如果我通过propertyMock2.Object
,它会按预期工作。
我不知道为什么第一次设置不起作用。
ReSharper给了我一些提示,但我不明白。 在第一个设置中,它显示“隐式捕获闭包:property2”,在第二个设置中它显示“隐式捕获闭包:property1”。
为什么每个lambda都会捕获另一个lambda的参数?它们甚至是如何相关的? 为什么第一个设置不起作用?
答案 0 :(得分:1)
还有另一种方法可以设置模拟方法,以便对不同的输入采取不同的反应:
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);
我总是要提醒自己,还有其他类型的返回包括泛型类型。