我正在做一些單元測試,並使用Moq嘲諷一些屬性。爲什麼我想模擬的屬性需要虛擬?
現在,這是一個控制器測試(ASP.NET MVC 3)。我的控制器來自摘要控制器,稱爲摘要控制器。
該控制器對Http上下文具有依賴性(爲了執行諸如主題,基於HTTP HOST頭的域特定邏輯等)。 - 在構造函數設置它
public abstract class AbstractController : Controller
{
public WebSiteSettings WebSiteSettings { get; private set; }
// other code
}
通知私人組:
這是通過一個名爲WebSiteSettings屬性來實現。所以,我改變了它使用的接口,而這正是我一直嘲笑:
public IWebSiteSettings WebSiteSettings { get; private set; }
然後,我創建了一個「FakeWebSiteSettings」,它嘲笑HTTP上下文,以便它讀取HTTP標頭。
的問題是,當我運行測試,得到了一個NotSupportedException異常:
非虛擬(在VB重寫)構件上無效設置:X => x.WebSiteSettings
下面是相關的嘲弄代碼:
var mockWebSiteSettings = new Mock<FakeWebSiteSettings>();
var mockController = new Mock<MyController>(SomeRepository);
mockController.Setup(x => x.WebSiteSettings).Returns(mockWebSiteSettings.Object);
_controller = mockController.Object;
var httpContextBase = MvcMockHelpers.FakeHttpContext();
httpContextBase.Setup(x => x.Request.ServerVariables).Returns(new NameValueCollection
{
{"HTTP_HOST","localhost.www.mydomain.com"},
});
_controller.SetFakeControllerContext(httpContextBase.Object);
如果我讓WebsiteSettings
財產虛擬 - 測試通過。
但我不明白爲什麼我需要這樣做。我不是覆蓋財產,我只是嘲笑它是如何設置的。
我錯過了什麼,或者做錯了什麼?
所以....我做了什麼是唯一的方法? – RPM1984 2011-04-14 23:47:11
只有Moq的方式。其他如TypeMock Isolator,Moles等可攔截這些方法/屬性 – aqwert 2011-04-15 00:08:57
哦,哇!這個魔術字是界面! – 321X 2012-11-11 23:17:08