2012-04-04 91 views
1

助手:嘲讽的RouteData测试的HtmlHelper RouteLink

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 

问题: 如何嘲笑路线有正确的路线名称?

+0

我猜测了一下,但我会想你需要注册路由,以便它在RouteDictionary中。 – 2012-04-05 00:43:25

回答

0

相反mockin的routevalues的告诉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()); 

我从来没有测试的帮手像你的,但我认为这应该有效

+1

我已经添加了一个路线,但仍然是相同的错误... routes.MapRoute( “route-name”,“{controller}/{tournament}/{action}/{id}”, new {controller =“controller”,action =“action”,tournament =“”, id =“”} ); Application.RegisterRoutes(routes);' – keeg 2012-04-06 17:50:37