2012-06-03 13 views
126

Próbuję napisać kilka testów jednostkowych dla mojego ApiController i napotkałem pewne problemy. Istnieje dobra metoda rozszerzenia o nazwie Request.CreateResponse, która bardzo pomaga w generowaniu odpowiedzi.Testowanie jednostki ASP.NET WebApi za pomocą Request.CreateResponse

public HttpResponseMessage Post(Product product) 
{ 
    var createdProduct = repo.Add(product); 
    return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct); 
} 

Czy istnieje jakiś sposób, aby drwić CreateResponse bez korzystania z częściowych mocks lub bezpośrednio za pomocą „nowego HttpResponseMessage (...)”?

+1

Dlaczego chcesz mock 'CreateResponse'? Dlaczego nie zwrócić na zwróconych właściwościach 'HttpResponseMessage'' Content' i 'StatusCode', że ustawione są prawidłowe wartości? – nemesv

+3

Jeśli uruchomię tę metodę w postaci testów jednostkowych, zakończy się ona niepowodzeniem z wyjątkiem tego, że konfiguracja nie jest ustawiona. – asa

+1

Ok, wstyd mi, po prostu potrzebowałem napisać this.Request.CreateResponse (HttpStatusCode.Accepted, createdProduct, GlobalConfiguration.Configuration) – asa

Odpowiedz

215

Innym sposobem rozwiązania tego problemu jest wykonanie następujących czynności:

controller.Request = new HttpRequestMessage(); 
controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, 
            new HttpConfiguration()); 

przypadku uaktualniania do WebAPI 5.0, wtedy trzeba zmienić na:

controller.Request = new HttpRequestMessage(); 
controller.Request.SetConfiguration(new HttpConfiguration()); 

powód dlaczego musisz to zrobić, ponieważ musisz mieć na kontrolerze Request, w przeciwnym razie metody rozszerzeń na Request nie będą działać. Musisz również mieć zestaw HttpConfiguration na Żądanie, w przeciwnym razie routing i inne części potoku nie będą działać poprawnie.

+0

Tak, to może również zadziałać, ale wygląda na to, że Request.CreateResponse również działa. – asa

+4

Dodanie pliku GlobalConfiguration.Configuration pozostawia zapytanie puste. Ustawienie żądania zadziałało, ale to nie był koniec moich problemów, ponieważ moja akcja również wywoływała Url.Link, a nazwa trasy nie została zdefiniowana. – foolshat

+0

Pomoc w konfigurowaniu trasy http://stackoverflow.com/questions/11779311/testing-webapi-controller-url-link – foolshat

20

Można skonfigurować obiekt kontrolera dla testowalności tak:

var config = new HttpConfiguration(); 
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/products"); 
var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"); 
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "products" } }); 

controller.ControllerContext = new HttpControllerContext(config, routeData, request); 
controller.Request = request; 
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; 

Skopiowane z Petera Provost obfitego blogu na Unit Testing ASP.NET Web API.

0

WebAPI 1 tutaj z podobnym problemem przy użyciu VB.

udało mi się odpowiedzi hybrydowych tutaj, aby uzyskać to do pracy tak proste, jak to:

Dim request As HttpRequestMessage = New HttpRequestMessage() 
Return request.CreateResponse(HttpStatusCode.BadRequest, myCustomClassObject, GlobalConfiguration.Configuration) 

Wystarczy opublikowania w przypadku pomaga nikomu.

0

W swojej klasie testowej utwórz instancję klasy kontrolera. np var customerController= new CustomerController();

customerController.Request = new HttpRequestMessage(); 
customerController.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration()); 
Powiązane problemy