2014-07-22 13 views
8

Ich habe einen Controller mit einem Routing-Attribut. Dieser Controller versagt in einem Gerät zu testen, weil die Route nicht gefunden werden kann:Komponententests mit attributbasiertem Routing

A route named 'Values' could not be found in the route collection

Dies ist die Controller-Methode:

[Route("api/values", Name="ApiValues")] 
[HttpGet] 
public HttpResponseMessage Get() 
{ 
    urlHelper.Link("ApiValues", new {}); 
} 

Das ist mein Unit-Test:

var valuesController = new ValuesController() 
{ 
    Request = new HttpRequestMessage 
    { 
     RequestUri = new Uri("http://localhost/api/") 
    }, 
    Configuration = new HttpConfiguration() 
}; 

valuesController.Get(); 

ich auch versuchte, dies zu dem Komponententest hinzuzufügen:

Aber das half nichts.

+0

Es ist seltsam, dass ich nicht Ihr Problem repro kann. Alles funktioniert gut auf meiner Maschine. Welche Version von Webapi hast du benutzt? Haben Sie Ihren gesamten Testcode bereitgestellt? Ich denke, der Komponententest wird nicht über den Attribut-Routing-Teil ausgeführt. –

+0

Was ist "urlHelper" in Ihrer Controller-Aktion? Kannst du es teilen? Danke –

Antwort

11

habe ich den gleichen Fehler:

A route named 'Values' could not be found in the route collection. 

Aber die Unit-Test auf meiner Maschine passiert, nachdem ich MapHttpAttributeRoutes und EnsureInitialized hinzufügen:

var valuesController = new ValuesController() 
{ 
    Request = new HttpRequestMessage { RequestUri = new Uri("http://localhost/api/") }, 
    Configuration = new HttpConfiguration() 
}; 

valuesController.Configuration.MapHttpAttributeRoutes(); 
valuesController.Configuration.EnsureInitialized(); 

valuesController.Get(); 

Können Sie mit mehr Informationen zur Verfügung stellen, das Problem Repro oder prüfen, ob es einen Unterschied zwischen unserem Testcode gibt?

+0

Ich habe alles überprüft, weil du gesagt hast, es hat funktioniert. Und es funktioniert auch auf meiner Maschine. Vielen Dank! – user369117

1

Anstatt den Controller direkt in den Unit-Tests aufzurufen, verwenden Sie Helper-Methoden, um Controller context und Action context zu erhalten. Dadurch wird die Verwendung von

valuesController.Configuration.MapHttpAttributeRoutes(); 
valuesController.Configuration.EnsureInitialized(); 

Siehe die ehrfürchtigen Erklärung von Filip W. vermeiden auf Testing routes in Web API 2