2010-06-23 52 views
0

我試圖嘲笑ASP.NET MVC2 Controller使用Moq但我得到一個錯誤,因爲我試圖模擬一個不可覆蓋的屬性。我應該怎麼做?有人可以幫我用Moq模擬這個ASP.NET MVC控制器嗎?

注意:我試圖模擬的控制器是(abstractASP.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); 
+0

你能顯示你正在測試的代碼嗎?也許有一個更簡單的方法。 – 2010-06-23 06:28:46

+0

爲什麼不創建一個虛擬控制器類,並將其用於測試而不是試圖嘲笑它呢? – 2010-06-23 07:27:21

+0

這是我的問題,Marnix。這裏有什麼好的做法?我覺得創建一個虛擬控制器'味道不好',並想看看其他人做了什麼。 – 2010-06-23 08:32:23

回答

0

對於試驗,我測試類等內部創建測試類的控制器:

protected class TestController : Controller { } 

然後我有可用於這個試驗中的分離的測試類。然後你可以使用這個TestController實例。

相關問題