问题描述
试图做一些控制器在我的ASP.NET MVC 3 Web应用程序单元测试。
我的测试是这样的:
[TestMethod的]
公共无效Ensure_CreateReviewHttpPostAction_RedirectsAppropriately()
{
//安排。
变种newReview = CreateMockReview(); //法案。
VAR的结果= _controller.Create(newReview)为RedirectResult; //断言。
Assert.IsNotNull(结果,RedirectResult不退换);
}
pretty简单。基本上测试 [HttpPost]
行动,以确保它返回一个 RedirectResult
(PRG模式)。我没有使用 RedirectToRouteResult
因为没有超载的支持锚链接。上移动。
现在,我使用的起订量以嘲笑HTTP上下文,包括服务器变量,控制器上下文,会话等一切正常为止。
直到我已经打了这条线在我的操作方法:
返回重定向(Url.LandingPageWithAnchor(someObject.Uri,review.Uri);
LandingPageWithAnchor
是一个自定义的HTML帮助:
公共静态字符串LandingPageWithAnchor(这UrlHelper帮手,串uri1,串uri2)
{
常量字符串网址格式={0}#{1}; 返回的String.Format(网址格式,
helper.RouteUrl(LANDING_PAGE,新的{URI = uri1})
uri2);
}
基本上,我重定向到另一个网页,其中一个是登陆页的新内容,对新的审查锚。酷。
现在,这个方法之前,因为 UrlHelper
为null失败。
所以我做这在我的嘲弄:
controller.Url =新UrlHelper(fakeRequestContext);
这得到了进一步,但现在它的失败,因为路由表不包含定义LANDING_PAGE。
所以我知道我需要模拟东西,但林不知道,如果它是:
一)路由表
二)UrlHelper.RouteUrl方法
三)UrlHelper.LandingPageWithAnchor扩展方法我写了
任何人都可以提供一些指导?
修改
这特别的路线是在区,所以我打过电话的区域登记我的单元测试:
AreaRegistration.RegisterAllAreas();
但我得到一个出现InvalidOperationException
:
Got it working by mocking the HttpContext, RequestContext and ControllerContext, registering the routes then creating a UrlHelper
with those routes.
Goes a little like this:
public static void SetFakeControllerContext(this Controller controller, HttpContextBase httpContextBase)
{
var httpContext = httpContextBase ?? FakeHttpContext().Object;
var requestContext = new RequestContext(httpContext, new RouteData());
var controllerContext = new ControllerContext(requestContext, controller);
MvcApplication.RegisterRoutes();
controller.ControllerContext = controllerContext;
controller.Url = new UrlHelper(requestContext, RouteTable.Routes);
}
FakeHttpContext()
is a Moq helper which creates all the mock stuff, server variables, session, etc.
这篇关于ASP.NET MVC控制器单元测试 - 问题与UrlHelper扩展的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!