2014-07-22 12 views
8

Posiadam kontroler z atrybutem routingu. Sterownik ten nie w badanej jednostki, ponieważ trasa nie została znaleziona:Testy jednostkowe z routingiem opartym na atrybutach

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

Jest to metoda kontroler:

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

To mój testów jednostkowych:

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

valuesController.Get(); 

ja również próbowałem dodać to do testu jednostkowego:

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

Ale to nic nie pomogło.

+0

To dziwne, że nie mogę powtórzenia błędu problem. Wszystko działa dobrze na mojej maszynie. Jaka jest używana wersja webapi? Czy podałeś cały swój kod testowy? Myślę, że test jednostkowy nie będzie działał na temat części routingu atrybutu. –

+0

Co to jest "urlHelper" w akcji kontrolera? Czy możesz podzielić się nim w pełni? Dzięki –

Odpowiedz

11

Mam ten sam błąd:

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

ale test jednostka przechodzi na moim komputerze po dodaniu MapHttpAttributeRoutes i 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(); 

mogę podać więcej informacji do repro problemu lub sprawdzić, czy istnieje różnica między naszym kodem testowym?

+0

Sprawdziłem wszystko, ponieważ powiedziałeś, że zadziałało. I działa też na moim komputerze. Dzięki! – user369117

1

Zamiast wywoływać kontroler bezpośrednio w testach jednostkowych, użyj metod pomocy, aby uzyskać Controller context i Action context. Pozwoli to uniknąć stosowania

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

Patrz niesamowite wyjaśnienie Filip W. na Testing routes in Web API 2