MOQ – 如何使用SetupGet / SetupSet手动创建支持属性?

我知道我们可以调用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(); //mockA.SetupAllProperties(); mockA.SetupGet(m => mB).Returns(b); mockA.SetupSet(m => mB).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

一个简单的解决方

更改返回(b)返回(()=> b),以使’b’成为捕获的变量,而不仅仅是通过值传递给方法的变量。