2009-12-11 1 views
4

MvcContrib의 ShouldMapTo 함수를 사용하여 경로 테스트에 예상되는 오류가 발생합니다. 결과에 따르면 모든 것이 정상이지만 도우미는 불행히도 스파 스 메시지가있는 AssertionException을 발생시킵니다. MVC1 및 해당 MvcContirb 사용하고 있습니다.MvcContrib ShouldMapTo TestHelper가 예기치 않게 AssertionException을 throw합니다.

[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)); 
} 

첫 번째 두 행은 예외가 발생하지 않아야 함을 나타냅니다. {controller}/{action}/{districtNumber}/{surveyYear}의 올바른 경로와 일치하도록 올바른 컨트롤러, 액션, 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입니다 : 일치하지 않는 매개 변수의 값입니다. 가

사람이 여기에 대한 단서를 가지고 있습니까 RouteTestingExtensions.cs

의 내부 컨트롤러
을 : 공공 정적으로 RouteData ShouldMapTo (이으로 RouteData으로 RouteData, 표현> 액션) TController : 나는이를 아래로 추적 한

하나?

답변

3

아마 당신은 이미 뭔가를 시도했지만이 질문에 착수하고 도움을 얻지 못한 사람들이있을 것입니다. 그래서 나는 문제에 대한 정보를주기 위해 노력할 것이라고 생각했습니다.

나는이 문제와 관련이 있음을 인정해야한다. 통찰력을 얻으려면 다른 포럼을 참조하겠습니다. 개별적으로 테스트 할 수있는 바인딩을 모델링하기 위해 달려 그

MVC있는 contrib 매개 변수를 매핑하지 않습니다 :

조나단 맥 크라켄 (내가 아주 많이 좋아한다 "테스트 드라이브 ASP.NET MVC"의 저자) . 따라서 매개 변수가있는 이러한 경우에는 null을 전달해야하며 테스트가 통과합니다.

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 
      ); 
    } 
} 

I :

[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을 추가해야합니다 : 여기

는 솔루션입니다 Global.asax.cs 파일에서 이것을 추출 했으므로 이제 다음과 같이 변경해야합니다.

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

소스 (7 월 (21) 2010) : 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; 
    } 

소스 (11 월 (25), 2008) : http://flux88.com/blog/fluent-route-testing-in-asp-net-mvc/는 답장을

+0

감사합니다 (이 구식 약간 수 있습니다). 나는 이것에 대해 잊어 버렸다. 마지막 대답은 MvcContrib에 대한 소스 코드를 다운로드하고 바이너리가 아닌 소스에 링크하면 오류가 더 이상 발생하지 않는다는 것입니다. 우리는 우리가 사용하고 있던 .dll 버전에 이상한 버그가 있었음에 틀림 없어, MvcContrib.dll의 최신 버전을 사용하기 시작했다. – ARM

관련 문제