2011-04-07 79 views
7

我知道我们可以拨打SetupAllProperties()自动创建支持属性。但是这太限制了,因为它不允许我在getter/setter中执行额外的代码。例如,我想创建一个moq'd setter来调用其他方法/事件/逻辑。MOQ - 如何使用SetupGet/SetupSet手动创建支持属性?

下面的代码示例重现问题

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 
    } 
} 

由于吸气剂设置返回局部变量(我猜是现在拍摄的变量)的值,我希望看到mockA.Object.B == 2。但相反,它是1

我从根本上失去了一些东西吗?或者这是一个MOQ错误?我正在运行最小起订量4.0.10501.6

回答

13

一个简单的解决方案。

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