Moq设置和关闭

本文关键字:设置 Moq | 更新日期: 2023-09-27 18:27:18

使用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);

但是,当我调用factoryMock.Object.Create(obj, propertyMock1.Object)时,返回值是null。如果我通过了propertyMock2.Object,它会按预期工作。

我不知道为什么第一个设置不起作用。

ReSharper给了我一些暗示,但我不明白。在第一个设置中,它显示"隐含捕获的闭包:property2",在第二个设置中显示"隐含捕捉的闭包:property1"。

为什么每个lambda都要捕获另一个lambda的参数?它们是如何联系在一起的?为什么第一个设置不起作用?

Moq设置和关闭

还有另一种方法可以设置模拟方法来对不同的输入做出不同的反应:

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);

我总是要提醒自己,Returns还有其他风格,包括泛型类型。