2011-04-07 78 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'成爲一個捕獲變量而不僅僅是一個通過值傳遞給方法的變量。