如何使用查询字符串测试URL的路由/操作解析?

时间:2010-05-25 17:04:17

标签: c# asp.net-mvc mvccontrib-testhelper

我正在尝试在单元测试中使用以下代码,

/* 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中没有明确的路由设置,因为默认路由适用于实际应用程序 - 它只是在此测试中不起作用。

2 个答案:

答案 0 :(得分: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参数将初始化为各自的值路线。

答案 1 :(得分:1)