2014-03-27 95 views
0

我有一個類的函數返回一個基於類屬性的狀態值。在這個例子中,如果Name不爲null,我希望HasName()返回true。我可以簡單地做Returns(false),但是我希望它評估爲lambda,以便在測試過程中修改Name的情況下它可以正常工作。Moq的參考成員lambda

public interface IThing 
{ 
    string Name { get; set; } 
    bool HasName(); 
} 

var mocks = new Dictionary<string, IThing>(); 
Mock<IThing> mockThing; 

mockThing = new Mock<IThing>(); 
mockThing.SetupProperty(m => m.Name, "test"); 
mockThing.Setup(m => m.HasName()).Returns(() => 
    { 
     return mockThing.Object.Name != null; 
    }); 
mocks["first"] = mockThing.Object; 

mockThing = new Mock<IThing>(); 
mockThing.SetupProperty(m => m.Name, "test"); 
mockThing.Setup(m => m.HasName()).Returns(() => 
    { 
     return mockThing.Object.Name != null; 
    }); 
mocks["second"] = mockThing.Object; 


Console.WriteLine(mocks["first"].HasName()); 
mocks["first"].Name = null; 
Console.WriteLine(mocks["first"].HasName()); 

第二個Console.WriteLine由於作用域(引用第二個模擬)而打印true而不是false。實際上,Resharper抱怨「訪問修改後的關閉」。什麼是正確的方法來做到這一點?

回答

1

雖然你的設計有點怪,但你可以在你的Setup功能訪問與mockThing.Object生成的模擬對象:

mockThing.Setup(m => m.HasName()).Returns(() => 
{ 
    return mockThing.Object.Name != null; 
}); 

var thing = mockThing.Object; 
var hasName = thing.HasName(); // true because Name returns "test" 
thing.Name = null; 
hasName = thing.HasName(); // false 

的問題是,你引用的mockThing與lambda表達式,然後你reasigning它。所以這兩個安裝程序將最終使用相同的實例。

從字典中使用嘲笑,也將努力:

var mocks = new Dictionary<string, IThing>(); 
Mock<IThing> mockThing; 

mockThing = new Mock<IThing>(); 
mocks["first"] = mockThing.Object; 
mockThing.SetupProperty(m => m.Name, "test"); 
mockThing.Setup(m => m.HasName()).Returns(() => 
{ 
    return mocks["first"].Name != null; 
}); 


mockThing = new Mock<IThing>(); 
mocks["second"] = mockThing.Object; 
mockThing.SetupProperty(m => m.Name, "test"); 
mockThing.Setup(m => m.HasName()).Returns(() => 
{ 
    return mocks["second"].Name != null; 
}); 


Console.WriteLine(mocks["first"].HasName()); 
mocks["first"].Name = null; 
Console.WriteLine(mocks["first"].HasName()); 
+0

這並不在我有限的例子的工作,但我意識到,我的問題更多的是與作用域。我添加了多個mock,lambda中的範圍是一個問題。我通過更好的演示更新了我的示例。 – wtjones

+0

我已經更新了我的答案 – nemesv

+0

這對我很有用。我還能夠在foreach循環中創建模擬,只要我在每次迭代時將密鑰分配給新的變量。 謝謝! – wtjones