C# 路由中带有可选参数的RouteTester问题
我有一个带有路由的MVC4 WebApi项目,该项目使用路由中的可选“id”参数正常工作:C# 路由中带有可选参数的RouteTester问题,c#,unit-testing,asp.net-web-api,asp.net-web-api-routing,C#,Unit Testing,Asp.net Web Api,Asp.net Web Api Routing,我有一个带有路由的MVC4 WebApi项目,该项目使用路由中的可选“id”参数正常工作: routes.Add(new ApiRouteInfo { Name = this.AreaName.ToLower() + "_readingsplans", RouteTemplate = baseUrl + "/plans/readingalerts/{id}", Defaults = new
routes.Add(new ApiRouteInfo
{
Name = this.AreaName.ToLower() + "_readingsplans",
RouteTemplate = baseUrl + "/plans/readingalerts/{id}",
Defaults = new
{
area = this.AreaName.ToLower(),
controller = "ReadingAlerts",
id = RouteParameter.Optional
}
});
当发出实际请求时,路由会命中控制器方法中的GetAll或Get方法:
public HttpResponseMessage GetAll(BaseQueryFilter filter)
public HttpResponseMessage Get(int id)
但是在单元测试中,RouteTester对象总是命中Get方法,而不是GetAll
作品:
Assert.AreEqual(ReflectionHelper.GetMethodName((ReadingAlertsController p) => p.Get(It.IsAny<int>())), routeTester.GetActionName());
我尝试传入一个实际的筛选器对象,而不是null,但这根本不会改变结果
我知道我可以通过创建两个不同的路由来修复它,但我有点不情愿,因为当前的路由除了单元测试之外,其他都可以
有什么建议吗?你看了吗?它解释了很多关于单元测试web api的内容,可能对您很有用。您看过吗?它解释了很多关于单元测试web api的内容,它可能对您很有用。我找到了一个描述如何测试路由的方法。我正在使用类似的东西,我发现在网上,但我愿意尝试它
下面是另一个类似的实现。这就是我正在使用的,并且有类似的问题
--更新--
我相信我找到了解决问题的办法。使用上述文章,我将“GetActionDescriptor()”函数替换为以下函数:
private HttpActionDescriptor GetActionDescriptor()
{
if (controllerContext.ControllerDescriptor == null)
GetControllerType();
var actionSelector = new ApiControllerActionSelector();
var results = actionSelector.GetActionMapping(controllerContext.ControllerDescriptor);
try
{
return actionSelector.SelectAction(controllerContext);
}
catch
{
var subActions = results[request.RequestUri.Segments.Last()];
var action = subActions.FirstOrDefault(a => a.SupportedHttpMethods.First(m => m.Method == request.Method.Method) != null);
return action;
}
}
我找到了一个描述如何测试路线的方法。我正在使用类似的东西,我发现在网上,但我愿意尝试它
下面是另一个类似的实现。这就是我正在使用的,并且有类似的问题
--更新--
我相信我找到了解决问题的办法。使用上述文章,我将“GetActionDescriptor()”函数替换为以下函数:
private HttpActionDescriptor GetActionDescriptor()
{
if (controllerContext.ControllerDescriptor == null)
GetControllerType();
var actionSelector = new ApiControllerActionSelector();
var results = actionSelector.GetActionMapping(controllerContext.ControllerDescriptor);
try
{
return actionSelector.SelectAction(controllerContext);
}
catch
{
var subActions = results[request.RequestUri.Segments.Last()];
var action = subActions.FirstOrDefault(a => a.SupportedHttpMethods.First(m => m.Method == request.Method.Method) != null);
return action;
}
}
这是一篇有趣的文章,但不幸的是,这篇文章无助于解决我的问题。本文所涉及的任何测试都是对控制器方法本身的测试,我遇到的问题是当只测试路由时。最让我感到困惑的是,在调用API时,路由确实正常工作,只是RouteTester在测试中无法解析正确的路由/方法。那篇文章实际上是在测试控制器,而不是路由。我遇到了同样的问题。这是一篇有趣的文章,但不幸的是,这篇文章对我的问题没有帮助。本文所涉及的任何测试都是对控制器方法本身的测试,我遇到的问题是当只测试路由时。最让我感到困惑的是,在调用API时,路由确实正常工作,只是RouteTester在测试中无法解析正确的路由/方法。那篇文章实际上是在测试控制器,而不是路由。我遇到了同样的问题。