4

我在使用 MvcContrib 的 ShouldMapTo 函数进行路由测试时遇到了预期错误。根据结果​​,一切都很好,但是助手抛出了一个 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));
}

前两行表明不应抛出异常。我正在映射正确的控制器、操作、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 : 参数值不匹配。

我已将此追踪到: public static RouteData ShouldMapTo(this RouteData routeData, Expression> action) where TController : Controller
which is inside RouteTestingExtensions.cs

有人对这个有任何线索吗?

4

1 回答 1

3

可能您已经解决了一些问题,但可能还有其他一些人正在解决这个问题并且没有得到任何帮助。所以我想我会尝试提供一些关于这个问题的信息。

我不得不承认我自己也纠结过这个问题。请让我参考另一个论坛以获取一些见解。

Jonathan McCracken(我非常喜欢“Test-Drive 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/(可能有点过时了)

于 2011-02-18T21:21:58.723 回答