我正在尝试在单元测试中使用以下代码,
/* 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中没有明确的路由设置,因为默认路由适用于实际应用程序 - 它只是在此测试中不起作用。
答案 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
,并且startPage
和endPage
参数将初始化为各自的值路线。
答案 1 :(得分:1)