【问题标题】:Mocking RouteData to test HtmlHelper RouteLink模拟 RouteData 以测试 HtmlHelper RouteLink
【发布时间】:2012-04-04 21:33:04
【问题描述】:

帮手:

public static MvcHtmlString RouteLink(this HtmlHelper helper, String linkText, String routeName, Object routeValues, String status)
{
    if (status.ToLower() == "post-game" || status.ToLower() == "mid-game")
    {
        return helper.RouteLink(linkText, routeName, routeValues);
    }

    return MvcHtmlString.Create(" ");
}

单元测试:

[TestMethod]
public void RouteLinkTest()
{
    var httpContext = new Mock<HttpContextBase>();
    var routeData = new Mock<RouteData>();
    var viewContext = new ViewContext { HttpContext = httpContext.Object, RouteData = routeData.Object };

    var helper = new HtmlHelper(viewContext, new Mock<IViewDataContainer>().Object);
    var target01 = helper.RouteLink("Linking Text", "route-name", new { id = "id" }, "status");
    Assert.IsNotNull(target01);
}

错误:

Test method Web.Tests.Extensions.HtmlHelpersTest.RouteLinkTest threw exception: 
System.ArgumentException: A route named 'route-name' could not be found in the route collection.
Parameter name: name

问题: 如何模拟路线以获得正确的路线名称?

【问题讨论】:

  • 我猜了一下,但我原以为您需要注册路线,以便将其放在 RouteDictionary 中。

标签: c# asp.net-mvc-3 unit-testing moq


【解决方案1】:

不是模拟路由值而是告诉 MvcApplication 注册它们

  var routes = new RouteCollection();
  MvcApplication.RegisterRoutes(routes);

当我必须在我的控制器中使用类似的东西测试一些 redirectToAction 时,我会使用它

  var controller = GetController();
  var httpContext = Utilities.MockControllerContext(true, false).Object;
  controller.ControllerContext = new ControllerContext(httpContext, new RouteData(), controller);
  var routes = new RouteCollection();
  MvcApplication.RegisterRoutes(routes);
  controller.Url = new UrlHelper(new RequestContext(httpContext, new RouteData()), routes);
  var result = controller.DoMyStuff();
  Assert.IsInstanceOfType(typeof(RedirectResult), result);
  var actual = (RedirectResult)result;
  Assert.AreEqual("/myurl", actual.Url.ToString());

我从未测试过像你这样的助手,但我认为这应该可行

【讨论】:

  • 我添加了一条路线,但还是同样的错误...var routes = new RouteCollection(); routes.MapRoute( "route-name", "{controller}/{tournament}/{action}/{id}", new { controller = "controller", action = "action", tournament = "", id = "" } ); Application.RegisterRoutes(routes);
猜你喜欢
  • 2018-01-23
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多