【问题标题】:How can I test route/action resolution of URL with query string?如何使用查询字符串测试 URL 的路由/操作解析?
【发布时间】:2010-05-25 17:04:17
【问题描述】:

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

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

【问题讨论】:

  • 对其他 testHelper 有什么建议可以让路由测试像这个一样简单吗?

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


【解决方案1】:

恕我直言,仅对自定义路由进行单元测试是有意义的。测试查询字符串参数将被转换为控制器操作参数是不必要的,并且不会真正为您的应用程序带来任何价值。这项工作由默认模型绑定器完成,并由 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 参数都将从路由中初始化为它们各自的值。

【讨论】:

  • 这行得通,这就是我正在做的事情,但问题是我想用查询字符串(即“/Controller/Action?Query”)测试一个 URL,而 TestHelper 没有t 处理查询字符串。我本可以将搜索更改为使用路径而不是查询,但这将涉及客户端 JS 为请求构建 URL——在这种情况下,我不需要 JS,只需要一个简单的表单提交 GET。但是,您可能是对的,它只是不值得测试。当我问到我正在做的项目是我第一次涉足 MVC 时,我仍然不确定应该在多大程度上测试“神奇”部分。
  • 如果我的自定义路由仅适用于查询字符串怎么办? (除了我的路由之外,我的控制器的动作签名还有一个 id 参数,它由查询字符串传递——现在我该如何对那个自定义路由进行单元测试?)
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多