我正在尝试对我的进行一些单元测试WebApi http://www.asp.net/web-api路由配置。我想测试一下路线"/api/super"
映射到Get()
我的方法SuperController
。我已经设置了以下测试,但遇到了一些问题。
public void GetTest()
{
var url = "~/api/super";
var routeCollection = new HttpRouteCollection();
routeCollection.MapHttpRoute("DefaultApi", "api/{controller}/");
var httpConfig = new HttpConfiguration(routeCollection);
var request = new HttpRequestMessage(HttpMethod.Get, url);
// exception when url = "/api/super"
// can get around w/ setting url = "http://localhost/api/super"
var routeData = httpConfig.Routes.GetRouteData(request);
request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData;
var controllerSelector = new DefaultHttpControllerSelector(httpConfig);
var controlleDescriptor = controllerSelector.SelectController(request);
var controllerContext =
new HttpControllerContext(httpConfig, routeData, request);
controllerContext.ControllerDescriptor = controlleDescriptor;
var selector = new ApiControllerActionSelector();
var actionDescriptor = selector.SelectAction(controllerContext);
Assert.AreEqual(typeof(SuperController),
controlleDescriptor.ControllerType);
Assert.IsTrue(actionDescriptor.ActionName == "Get");
}
我的第一个问题是,如果我没有指定完全限定的 URLhttpConfig.Routes.GetRouteData(request);
抛出一个InvalidOperationException
异常,并显示消息“相对 URI 不支持此操作”。
我的存根配置显然遗漏了一些东西。我更喜欢使用相对 URI,因为使用完全限定的 URI 进行路由测试似乎不合理。
上面配置的第二个问题是我没有测试 RouteConfig 中配置的路由,而是使用:
var routeCollection = new HttpRouteCollection();
routeCollection.MapHttpRoute("DefaultApi", "api/{controller}/");
我如何使用指定的RouteTable.Routes
如典型 Global.asax 中的配置:
public class MvcApplication : HttpApplication
{
protected void Application_Start()
{
// other startup stuff
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
// route configuration
}
}
此外,我上面列出的可能不是最好的测试配置。如果有更精简的方法,我会洗耳恭听。