2009-12-11 55 views
4

我在使用MvcContrib的ShouldMapTo函数进行路由测试时遇到了预期的错误。根据结果​​,一切正常,但助手抛出一个AssertionException与一个不幸的稀疏消息。我使用MVC1和相应的MvcContirb。MvcContrib ShouldMapTo TestHelper意外抛出AssertionException

[Test] 
public void ThisShouldNotErrorButItDoes() 
{ 
    "~/District/ParticipantInfo/1907/2010".Route().Values.ToList().ForEach(r => Console.WriteLine(r.Key + ": " + r.Value)); 
    Console.WriteLine(((Route)"~/District/ParticipantInfo/1907/2010".Route().Route).Url); 
    "~/District/ParticipantInfo/1907/2010".ShouldMapTo<DistrictController>(c => c.ParticipantInfo(1907, 2010)); 
} 

前两行显示不应抛出异常。我正在绘制正确的控制器,操作,districtNumber和surveyYear,以匹配{controller}/{action}/{districtNumber}/{surveyYear}的正确路线。

我的路线:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Participation", 
      "{controller}/{action}/{districtNumber}/{surveyYear}", 
      new { controller = "District", action = "ParticipantInfo" }); 

     routes.MapRoute(
      "Default",               // Route name 
      "{controller}/{action}/{id}",          // URL with parameters 
      new { controller = "Home", action = "Index", id = string.Empty }); // Parameter defaults 
    } 

我得到的错误是MvcContrib.TestHelper.AssertionException:对于参数不匹配的价值。

我跟踪下来到:公共静态的RouteData ShouldMapTo(此的RouteData的RouteData,表达>动作) 其中TController:控制器
这是RouteTestingExtensions.cs

没有人对此有什么线索一?

回答

3

也许你已经做了一些事情,但可能有一些其他人登陆这个问题,并没有得到任何帮助。所以我想我会试着给出一些关于这个问题的信息。

我不得不承认自己纠缠于这个问题。 请让我参考另一个论坛的一些见解。

乔纳森·麦克拉肯(的“试驾ASP.NET MVC”,这是我非常喜欢的作者):

MVC的Contrib不映射参数,这就是高达模型绑定可单独进行测试。所以在这些你有参数的情况下,你需要传递null,然后你的测试会通过。

这里是解决方案:

[TestFixture] 
public class RouteDefinitionsTest 
{ 
    [SetUp] 
    public void setup() 
    { 
     var routes = RouteTable.Routes; 
     routes.Clear(); 
     RouteDefinitions.AddRoutes(routes); 
    } 

    [Test] 
    public void Should_Route_To_Edit_Page_With_Title() 
    {    
     "~/Todo/Edit". 
     ShouldMapTo<TodoController>(x => x.Edit(null)); 
    } 
} 

当然,你需要RouteDefinitions添加到您的Web项目,以及这是在这里:

public class RouteDefinitions 
{ 
    public static void AddRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("Default", // Route name 
         "{controller}/{action}/{id}", // URL with parameters 
         new {controller = "Home", action = "Index", id = string.Empty} // Parameter defaults 
      ); 
    } 
} 

我只是将其从Global.asax.cs文件中提取出来,因此现在需要更改为以下内容:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     RouteDefinitions.AddRoutes(routes); 
    } 

来源(2010年7月21日):http://forums.pragprog.com/forums/124/topics/4824

如果您关心的内部工作 “ShouldMapTo()”,那么这里是源。把自己打昏。

public static RouteData ShouldMapTo<TController>(this RouteData routeData, Expression<Func<TController, ActionResult>> action) 
     where TController : Controller 
    { 
     Assert.That(routeData, Is.Not.Null, "The URL did not match any route"); 

     //check controller 
     routeData.ShouldMapTo<TController>(); 

     //check action 
     var methodCall = (MethodCallExpression) action.Body; 
     string actualAction = routeData.Values.GetValue("action").ToString(); 
     string expectedAction = methodCall.Method.Name; 
     actualAction.AssertSameStringAs(expectedAction); 

     //check parameters 
     for (int i = 0; i < methodCall.Arguments.Count; i++) 
     { 
      string name = methodCall.Method.GetParameters()[i].Name; 
      object value = ((ConstantExpression) methodCall.Arguments[i]).Value; 

      Assert.That(routeData.Values.GetValue(name), Is.EqualTo(value.ToString())); 
     } 

     return routeData; 
    } 

来源(2008年11月25日):http://flux88.com/blog/fluent-route-testing-in-asp-net-mvc/(它可能是一个有点过时)

+0

感谢您的答复。我忘了这件事。最终的答案是,一旦我们下载了MvcContrib的源代码并链接到了源代码而不是二进制文件,这个错误就不再被抛出。我们认为它在我们使用的.dll版本中一定是一些奇怪的错误,所以我们开始使用MvcContrib.dll的新版本 – ARM 2011-02-19 05:14:52

相关问题