6

我试图在我的单元测试中使用如下代码,

/* Test setup code */
_routes = RouteTable.Routes;
MvcApplication.RegisterRoutes(_routes); //set up the routes as they would be in actual application
/* test code */
Expression<Func<SearchController, ActionResult>> actionFunc;
actionFunc = action => action.Results("x", 3, null);
RouteTestingExtensions.Route(
   "~/Search/Results?searchText=x"
).ShouldMapTo<SearchController>(actionFunc);

问题是,这是失败的“预期结果是结果?searchText = x”

有没有人有一个解决方案可以让我测试一个 URL(带有查询字符串)是否解析为正确的控制器、操作和参数?

仅供参考,我在 Global.asax.cs 中没有明确的路由设置,因为默认路由适用于实际应用程序 - 它在此测试中不起作用。

4

2 回答 2

9

恕我直言,仅对自定义路由进行单元测试是有意义的。测试查询字符串参数将被转换为控制器操作参数是不必要的,并且不会真正为您的应用程序带来任何价值。这项工作由默认模型绑定器完成,并由 Microsoft 进行了广泛的单元测试(我希望如此)。

话虽MVCContrib.TestHelper如此,您可以优雅地测试自定义路线。例如,假设您已经在应用程序中实现了分页并定义了一个自定义路由来为 SEO 提供漂亮的 url:

routes.MapRoute(
    "Custom",
    "foo/{startPage}/{endPage}",
    new 
    { 
        controller = "Search", 
        action = "Results", 
    }
);

这是相关的控制器:

public class SearchController : Controller
{
    public ActionResult Results(int startPage, int endPage)
    {
        return View();
    }
}

这条路线可以这样测试:

"~/foo/10/20".ShouldMapTo<SearchController>(c => c.Results(10, 20));

这将有效地测试默认控制器是Search,默认操作是Results,并且startPageendPage参数都将从路由初始化为它们各自的值。

于 2010-09-29T21:38:58.550 回答
1

也许 Phil Haack 的这些文章会有所帮助:

  1. http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx
  2. http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx
于 2010-09-29T21:14:39.027 回答