我正在尝试创建集成测试以确保我的视图中没有任何运行时错误。因此,我需要创建一个测试,检查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