【发布时间】:2015-08-31 17:37:01
【问题描述】:
我正在使用 WebApi2 attrbiute 路由项目,我正在尝试对路由进行单元测试(请求正在控制器中执行正确的 api 方法)。但到目前为止我无法让它工作......
似乎它没有选择属性中定义的路线 知道可能有什么问题或遗漏吗?
提前致谢!吉列尔莫。
这是我的单元测试代码:
var config = new HttpConfiguration
{
IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always,
};
config.Routes.MapHttpRoute(name: "Default", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional });
request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/api/homes/report");
route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
routeData = new HttpRouteData(route, new HttpRouteValueDictionary
{
{ "controller", "homes" },
});
config.MapHttpAttributeRoutes();
config.EnsureInitialized();
controller = new HomesController
{
Catalog = catalog.Object,
ControllerContext = new HttpControllerContext(config, routeData, request),
Request = request,
};
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
var routeTester = new RouteTester(config, request, controller.ControllerContext);
Assert.IsTrue(routeTester.CompareSignatures(ReflectionHelpers.GetMethodInfo((HomesController p) => p.GetHomesReport())));
RouteTester.cs
public class RouteTester
{
readonly HttpConfiguration config;
readonly HttpRequestMessage request;
readonly IHttpRouteData routeData;
readonly IHttpControllerSelector controllerSelector;
readonly HttpControllerContext controllerContext;
public RouteTester(HttpConfiguration conf, HttpRequestMessage req, HttpControllerContext context)
{
config = conf;
request = req;
controllerContext = context;
routeData = context.RouteData;
controllerSelector = new DefaultHttpControllerSelector(config);
}
public string GetActionName()
{
if (controllerContext.ControllerDescriptor == null)
GetControllerType();
var actionSelector = new ApiControllerActionSelector();
var descriptor = actionSelector.SelectAction(controllerContext);
return descriptor.ActionName;
}
public Type GetControllerType()
{
var descriptor = controllerSelector.SelectController(request);
controllerContext.ControllerDescriptor = descriptor;
return descriptor.ControllerType;
}
public bool CompareSignatures(MethodInfo method)
{
if (controllerContext.ControllerDescriptor == null)
GetControllerType();
var actionSelector = new ApiControllerActionSelector();
var x = actionSelector.GetActionMapping(controllerContext.ControllerDescriptor)[request.Method.ToString()];
return x.Any(item => ((MethodBase)(((ReflectedHttpActionDescriptor)item).MethodInfo)).ToString() == ((MethodBase)method).ToString());
}
ReflectionHelpers.cs
public class ReflectionHelpers
{
public static string GetMethodName<T, U>(Expression<Func<T, U>> expression)
{
var method = expression.Body as MethodCallExpression;
if (method != null)
return method.Method.Name;
throw new ArgumentException("Expression is wrong");
}
public static MethodInfo GetMethodInfo<T, U>(Expression<Func<T, U>> expression)
{
var method = expression.Body as MethodCallExpression;
if (method != null)
return method.Method;
throw new ArgumentException("Expression is wrong");
}
public static MethodInfo GetMethodInfo<T>(Expression<Action<T>> expression)
{
var method = expression.Body as MethodCallExpression;
if (method != null)
return method.Method;
throw new ArgumentException("Expression is wrong");
}
}
控制器 sn-p
[Route("api/homes/homereport")]
public void GetHomesReport()
{
var homeReportItems = HomeReport();
}
【问题讨论】:
标签: asp.net-web-api2 asp.net-web-api asp.net-web-api-routing