c# – ASP.NET MVC控制器单元测试 – UrlHelper扩展的问题

栏目: ASP.NET · 发布时间: 7年前

内容简介:http://stackoverflow.com/questions/5943730/asp-net-mvc-controller-unit-testing-problem-with-urlhelper-extension

尝试在我的ASP.NET MVC 3 Web应用程序中进行一些控制器单元测试.

我的测试是这样的:

[TestMethod]
public void Ensure_CreateReviewHttpPostAction_RedirectsAppropriately()
{
   // Arrange.
   var newReview = CreateMockReview();

   // Act.
   var result = _controller.Create(newReview) as RedirectResult;

   // Assert.
   Assert.IsNotNull(result, "RedirectResult was not returned");
}

很简单基本上测试一个[HttpPost]动作以确保它返回一个RedirectResult(PRG模式).我没有使用RedirectToRouteResult,因为没有一个重载支持锚链接.继续.

现在,我使用Moq来模拟Http上下文,包括服务器变量,控制器上下文,会话等.一切进展顺利.

直到我在我的动作方法中击中了这一行:

return Redirect(Url.LandingPageWithAnchor(someObject.Uri, review.Uri);

LandingPageWithAnchor是一个自定义HTML助手:

public static string LandingPageWithAnchor(this UrlHelper helper, string uri1, string uri2)
{
   const string urlFormat = "{0}#{1}";

   return string.Format(urlFormat,
                helper.RouteUrl("Landing_Page", new { uri = uri1}),
                uri2);
}

基本上,我重定向到另一个页面,这是一个新的内容的“着陆页”,新的评论有一个锚点.凉.

现在,由于UrlHelper为null,此方法失败.

所以我在嘲笑中做到了这一点:

controller.Url = new UrlHelper(fakeRequestContext);

哪个更进一步,但现在它失败了,因为路由表不包含“Landing_Page”的定义.

所以我知道我需要模拟“什么”,但不知道是否是:

a)路线表

b)UrlHelper.RouteUrl方法

c)我写的UrlHelper.LandingPageWithAnchor扩展方法

任何人都可以提供一些指导吗?

编辑

这个特定的路线是在一个区域,所以我尝试在我的单元测试中呼叫区域注册:

AreaRegistration.RegisterAllAreas();

但是我得到一个InvalidOperationException:

This method cannot be called during the application’s pre-start initialization stage.

通过嘲笑HttpContext,RequestContext和ControllerContext,注册路由,然后使用这些路由创建一个UrlHelper来工作.

有点像这样:

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()是一个Moq帮手,它创建所有的模拟东西,服务器变量,会话等.

http://stackoverflow.com/questions/5943730/asp-net-mvc-controller-unit-testing-problem-with-urlhelper-extension


以上所述就是小编给大家介绍的《c# – ASP.NET MVC控制器单元测试 – UrlHelper扩展的问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

与孩子一起学编程

与孩子一起学编程

[美] 桑德Warren Sande、Carter Sande / 苏金国、姚曜 等 / 人民邮电出版社 / 2010-11 / 65.00元

一本老少咸宜的编程入门奇书!一册在手,你完全可以带着自己的孩子,跟随Sande父子组合在轻松的氛围中熟悉那些编程概念,如内存、循环、输入和输出、数据结构和图形用户界面等。这些知识一点儿也不高深,听起来备感亲切,书中言语幽默风趣而不失真义,让学习过程充满乐趣。细心的作者还配上了孩子们都喜欢的可爱漫画和经过运行测试的程序示例,教你用最易编写和最易理解的Python语言,写出你梦想中的游戏程序。 ......一起来看看 《与孩子一起学编程》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具