我知道我们可以调用SetupAllProperties()
来自动创建支持属性。但这太严格了,因为它不允许我在getter / setter中执行额外的代码。例如,我想创建一个调用其他方法/事件/逻辑的moq'd setter。
以下代码示例重现了该问题
public interface IA
{
int B { get; set; }
};
class Test
{
[Test]
public void BackingPropertyTest()
{
int b = 1;
var mockA = new Mock<IA>();
//mockA.SetupAllProperties();
mockA.SetupGet(m => m.B).Returns(b);
mockA.SetupSet(m => m.B).Callback(val => b = val);
mockA.Object.B = 2;
Assert.AreEqual(2, b); // pass. b==2
Assert.AreEqual(2, mockA.Object.B); // fail. mockA.Object.B==1, instead of 2
}
}
由于getter设置为返回局部变量的值(我猜这是一个捕获变量),我希望看到mockA.Object.B == 2
。但相反,它是1
。
我从根本上错过了什么吗?或者这是一个MOQ错误?我正在运行MOQ 4.0.10501.6
答案 0 :(得分:14)
一个简单的解决方案。
更改返回(b)返回(()=&gt; b),以使'b'成为捕获的变量,而不仅仅是通过值传递给方法的变量。