2009-12-11 49 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

相關問題