Je suis en train de faire quelques tests unitaires de mon WebApi route de configuration. Je veux tester que l'itinéraire "/api/super"
cartes à l' Get()
méthode de mon SuperController
. J'ai configuré le test ci-dessous et je rencontre quelques problèmes.
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");
}
Mon premier problème est que si je n'ai pas spécifier une URL complète httpConfig.Routes.GetRouteData(request);
jette un InvalidOperationException
d'exception avec un message de "Cette opération n'est pas prise en charge pour un URI relatif."
Je suis évidemment manquer quelque chose avec mon écrasé de configuration. Je préfère utiliser un URI relatif car il ne semble pas raisonnable d'utiliser un spécialiste de URI pour la route test.
Mon deuxième problème avec ma configuration ci-dessus est que je ne suis pas tester mes itinéraires comme configuré dans mon RouteConfig mais je suis plutôt à l'aide de:
var routeCollection = new HttpRouteCollection();
routeCollection.MapHttpRoute("DefaultApi", "api/{controller}/");
Comment puis-je faire usage de la attribué RouteTable.Routes
tel que configuré dans un typique Mondiale.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
}
}
Ce que j'ai écrasé ci-dessus peuvent ne pas être la meilleure configuration de test. Si il y a une approche plus rationnelle, je suis toutes les oreilles.