我正在嘗試創建集成測試以確保我的視圖中沒有任何運行時錯誤。因此,我需要創建一個測試,檢查ViewResult.ExecuteResult()
是否正常工作,但似乎我遇到了麻煩。我怎樣才能正確地模擬我的controllercontext測試ViewResult.ExecuteResult()?
我發現this site這給了我一個起點,我有以下代碼:
[TestMethod]
public void RegisterResultExecutes()
{
//arrange
RequestContext requestContext = new RequestContext(new MockHttpContext(), new RouteData());
AccountController controller = new AccountController
{
FormsService = new MockFormsAuthenticationService(),
MembershipService = new MockMembershipService(),
Url = new UrlHelper(requestContext)
};
var result = controller.Register();
var sb = new StringBuilder();
Mock<HttpResponseBase> response = new Mock<HttpResponseBase>();
response.Setup(x => x.Write(It.IsAny<string>())).Callback<string>(y =>
{
sb.Append(y);
});
Mock<ControllerContext> controllerContext = new Mock<ControllerContext>();
controllerContext.Setup(x => x.HttpContext.Response).Returns(response.Object);
//act
result.ExecuteResult(controllerContext.Object);
}
的問題是,當result.ExecuteResult()
叫我得到下面的異常
System.NullReferenceException: Object reference not set to an instance of an object.
System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
MyApp.Tests.Controllers.AccountControllerTest.RegisterResultExecutes() in C:\Users\KallDrexx\Documents\Projects\MyApp\MyApp.Tests\Controllers\AccountControllerTests.cs: line 297
不幸的是,該堆棧跟蹤並不是非常有用,因爲我不確定它試圖訪問的是空值。有沒有人對我如何爲ExecuteResult()
創建測試有任何建議?
啊哈,這折射出了大量的信息。它是'RouteData'導致的問題,但現在看來我需要找到'context.RouteData.GetRequiredString(「action」);'返回一些有用的東西,因爲這就是我現在被卡住的地方 – KallDrexx 2011-05-17 03:19:43
嗯在正確設置了'RouteData'之後,似乎我處於我能做的事情的極限,而這似乎是不可能的。對'FindView()'的調用在System.Web.Compilation.BuildManager中的堆棧跟蹤中得到了一個'NullReferenceException'(字面上)層。GetCacheKeyFromVirtualPath()'。哦,很好:( – KallDrexx 2011-05-17 03:31:05
我擔心你會遇到這樣的顯示屏,你有什麼具體的東西想要在你的視圖中測試嗎?如果你想確保你的lambda表達式是好的(如果你使用的話)你可以[編譯你的意見](http://stackoverflow.com/questions/383192/compile-views-in-asp-net-mvc)。如果你想測試JavaScript,那麼我會谷歌周圍的JavaScript單元測試爲我知道那裏有框架,但我沒有用過,或者你想單元測試其他東西嗎? – 2011-05-17 12:13:16