我試圖嘲笑ASP.NET MVC2 Controller
使用Moq但我得到一個錯誤,因爲我試圖模擬一個不可覆蓋的屬性。我應該怎麼做?有人可以幫我用Moq模擬這個ASP.NET MVC控制器嗎?
注意:我試圖模擬的控制器是(abstract
)ASP.NET MVC2 Controller
...不是自定義控制器。爲什麼?我試圖測試一些定製控制器擴展我所做的。我實際上沒有自定義控制器類。
代碼:
// My own test helper magic shiz.
httpContextBaseMock = MockHelpers.GetAnHttpContextBaseMock();
controllerContextMock = new Mock<ControllerContext>();
controllerContextMock.Setup(x => x.HttpContext)
.Returns(httpContextBaseMock.Object);
controllerMock = new Mock<Controller>();
controllerMock.SetupGet(x => x.RouteData)
.Returns(RestMockHelpers.MockRouteData().Object);
即最後一行失敗,...
System.ArgumentException:無效 設置非可重寫的構件上:X => x.RouteData
然後我想,我不應該嘲笑controllerContext
,而只是創建它的一個實例..喜歡什麼REA_ANDREW did in his SO question ...
var controllerContext = new ControllerContext(_httpContextBaseMock.Object,
new RouteData(), new Mock<ControllerBase>().Object);
var controller = new Controller(); <-- Cannot do this.
Controller class is abstract.
,所以我不知道如果我需要讓我自己僞造的控制器類,在一些測試的輔助工具,它什麼都不做,而是從Controller
只是繼承。然後實例化。
但我覺得應該做的所有使用模擬的,而不是用一些起步的,然後讓某些情況下...
我很困惑:(
更新:
我被要求解釋我想要測試的代碼,我有一個自定義的ViewResult,並且構造函數設置了一個字符串屬性,我只是確保該屬性設置爲
// Act.
var myResult = new MyResult(controllerMock.Object);
// Assert.
Assert.NotNull(myResult);
Assert.AreEqual("controllerName", myResult.ControllerName);
你能顯示你正在測試的代碼嗎?也許有一個更簡單的方法。 – 2010-06-23 06:28:46
爲什麼不創建一個虛擬控制器類,並將其用於測試而不是試圖嘲笑它呢? – 2010-06-23 07:27:21
這是我的問題,Marnix。這裏有什麼好的做法?我覺得創建一個虛擬控制器'味道不好',並想看看其他人做了什麼。 – 2010-06-23 08:32:23