2014-07-22 15 views
8

Ho un controller con un attributo di instradamento. Questo controller non riesce in un test di unità, perché il percorso non è stato trovato:Test unitari con instradamento basato su attributi

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

Questo è il metodo di controllo:

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

Questo è il mio test di unità:

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

valuesController.Get(); 

anche io ho provato ad aggiungere questo al test dell'unità:

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

Ma questo non ha aiutato nulla.

+0

E 'strano che io non posso repro il problema. Tutto funziona bene sulla mia macchina. Qual è la versione di webapi che hai usato? Hai fornito tutto il tuo codice di prova? Penso che il test unitario non verrà eseguito sulla parte di attributo di routing. –

+0

Che cos'è "urlHelper" nell'azione del controller? Puoi condividere tutto questo? Grazie –

risposta

11

ho ottenuto lo stesso errore:

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

Ma il test di unità passa sulla mia macchina dopo aggiungo MapHttpAttributeRoutes e EnsureInitialized:

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

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

valuesController.Get(); 

può fornirvi ulteriori informazioni a Repro l'emissione o controllare se c'è qualche differenza tra il nostro codice di prova?

+0

Ho ricontrollato tutto, perché hai detto che funzionava. E funziona anche sulla mia macchina. Grazie! – user369117

1

Invece di chiamare direttamente il controller nei test delle unità, utilizzare i metodi di supporto per ottenere Controller context e Action context. Ciò eviterà l'uso di

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

consultare la spiegazione impressionante di Filip W. su Testing routes in Web API 2