代码之家  ›  专栏  ›  技术社区  ›  ARM

MvcContrib ShouldMapTo TestHelper意外引发AssertionException

  •  4
  • ARM  · 技术社区  · 16 年前

    我在使用MvcContrib的ShouldMapTo函数进行路由测试时遇到了一个预期的错误。根据结果,一切都很好,但是helper抛出了一个AssertionException,其中包含一个不幸的稀疏消息。我使用的是MVC1和相应的MvcContirb。

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

    我的路线:

        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:参数的值不匹配。

    我把它追溯到:public static RouteData shouldmappto(this RouteData RouteData,Expression>action) 其中TController:Controller
    在反渗透里面uteTestingExtensions.cs

    有人知道这件事吗?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Community Mohan Dere    6 年前

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

    我不得不承认,我自己也曾与这个问题纠结过。

    乔纳森·麦克拉肯(《试驾》一书的作者ASP.NETMVC”,我非常喜欢):

    mvccontrib不映射参数,这取决于可以单独测试的模型绑定。所以在这些有参数的情况下,你需要传递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));
        }
    }
    

    当然,您还需要将routedDefinitions添加到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
                );
        }
    }
    

        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/

    推荐文章