7

Mam metodę web api httppost. Muszę przekazać token jako nagłówek autoryzacji i zebrać odpowiedź.Jak mogę przetestować wywołanie post (web-api) za pomocą tokena?

Używam web-api 2. Metoda mojego postu zwraca IHttpActionResult ok (model).

Przetestowałem web-api przy użyciu klienta POSTMAN, który działa.

Utknąłem w punkcie, w którym nie jestem w stanie napisać UNIT-TEST, aby przetestować mój interfejs API.

Nie mogę również mieć projektu testu jednostki i projektu web-api w tym samym rozwiązaniu? Próbowałem ustawić projekt testowy jednostki i projekt web-api jako projekty startowe. Ale projekt testów jednostkowych jest po prostu biblioteką, więc nie zadziałałby.

Czy ktoś może mnie poprowadzić przez to?

Odpowiedz

13

Na początek zazwyczaj projekt testów jednostkowych i projekt Api są w tym samym rozwiązaniu. Jednak projekt API powinien być projektem startowym. Następnie należy użyć eksploratora testów wizualnych lub innego odpowiednika (np. Serwera kompilacji), aby uruchomić testy jednostek.

Aby przetestować kontrolery API, sugeruję utworzenie serwera testowego Owin w testach jednostkowych i użycie go do wykonywania żądań HTTP w oparciu o interfejs API.

[TestMethod] 
    public async Task ApiTest() 
    { 
     using (var server = TestServer.Create<Startup>()) 
     { 
      var response = await server 
       .CreateRequest("/api/action-to-test") 
       .AddHeader("Content-type", "application/json") 
       .AddHeader("Authorization", "Bearer <insert token here>") 
       .GetAsync(); 

      // Do what you want to with the response from the api. 
      // You can assert status code for example. 

     } 
    } 

Będziesz jednak musiał użyć zastrzyku zależności, aby wstrzyknąć swoje dragi/stubs. Będziesz musiał skonfigurować wtrysk zależności w klasie uruchamiania w projekcie Testy.

Here's Artykuł wyjaśniający bardziej szczegółowo serwer testowy Owin i klasę uruchamiania.

+0

dzięki za odpowiedź :) – user3825003

+0

bym upvote to 10 razy, gdybym mógł! – dcarson

+0

Aby sprawdzić uwierzytelnianie, zobacz ten post - http://stackoverflow.com/a/25057928/968003 –

0

Dla łatwego jednostki, trasy i testów integracyjnych, można sprawdzić MyTested.WebApi, który pozwala na wykonanie następujących czynności:

MyWebApi 
    .Server() 
    .Starts<Startup>() 
    .WithHttpRequestMessage(req => req 
     .WithRequestUri("/api/Books/Get") 
     .WithMethod(HttpMethod.Get) 
     .WithHeader(HttpHeader.Authorization, "Bearer " + this.accessToken)) 
    .ShouldReturnHttpResponseMessage() 
    .WithStatusCode(HttpStatusCode.OK) 
    .WithResponseModelOfType<List<BookResponseModel>>() 
    .Passing(m => m.Count == 10);