【问题标题】:Unit testing WebApi routes with custom handlers使用自定义处理程序对 WebApi 路由进行单元测试
【发布时间】:2013-11-27 15:58:47
【问题描述】:

我在测试路由时遇到问题,我认为这是由于路由使用了自定义处理程序。

This question 指出了类似的问题,但并不能完全解决我正在做的事情。

我有一个 RouteConfiguration 类,它只包含路由定义,使我能够将它们拉入应用程序以及任何测试例程:

// the route
ApiRoutes.MapHttpRoute(
    name: "Custom",
    routeTemplate: "api/service/{service}/{method}/{arguments}",
    defaults: new { arguments = RouteParameter.Optional },
    constraints: null,
    handler: new ServiceDispatcher(_httpConfiguration, _controllerHelper)
);

现在,当尝试使用 similar pattern to this 模拟路线的方式进行测试时,它找不到路线 (404)。选择部分如下所示(this article 中的其他代码未显示):

HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, "http://localhost/api/service/foo/bar/foobar");
DefaultHttpControllerSelector controllerSelector = new DefaultHttpControllerSelector(configuration);
HttpControllerDescriptor descriptor = controllerSelector.SelectController(message);

我(受过教育?)猜测是 DefaultHttpControllerSelector,但我不知道如何或是否可以更改它以支持我正在做的事情。

那么,我可以使用自定义处理程序使当前的例程正常工作吗?还是我找错了树?

【问题讨论】:

  • 查看您的代码,您似乎没有通过路由匹配运行请求...如果您注意到 Filip 的帖子,它有一个名为 RouteTester 的东西,它会调用类似config.Routes.GetRouteData(request);...此调用启动路由匹配逻辑...控制器选择器取决于当前请求中的路由数据来选择控制器,并且由于没有路由数据,您会看到这种行为..
  • @KiranChalla 我实际上已经掌握了那部分。当 GetActionName() 调用调用 _controllerSelector.SelectController() 的 GetControllerType() 时,会抛出 404。当我尝试解决这个问题时,我将恢复测试路由是否已配置,而不是通过路由实际测试路由。

标签: c# unit-testing asp.net-web-api routes


【解决方案1】:

当您将 MessageHandler 附加到路由时,控制器调度程序甚至不会被调用。它没有那么远。 如果你想测试路线,我会打电话给

    var routeDate = config.Routes.GetRouteData(request);

然后您可以检查路由值并测试服务、方法和参数参数。

【讨论】:

  • 太棒了,这是我所缺少的知识。我已将测试简化为简单地使用路线数据并使其正常工作。 IHttpRouteData ShouldHave(this IHttpRouteData route, string key, object value) - 感谢您的宝贵时间。
  • @PhilCooper 是的,无害的GetRouteData 方法实际上完成了所有路由匹配并在没有找到路由时返回 null 并不是很明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2020-08-13
相关资源
最近更新 更多