Я пытаюсь выполнить частичное тестирование конфигурации маршрута WebApi. Я хочу проверить, что маршрут "/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");
}
Моя первая проблема заключается в том, что если я не укажу полный URL-адрес httpConfig.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
}
}
Дальше то, что я пропустил выше, может быть не лучшей тестовой конфигурацией. Если есть более оптимизированный подход, я все уши.