Załóżmy, że to moja metoda działania
public IHttpActionResult Get(int id)
{
var status = GetSomething(id);
if (status)
{
return Ok();
}
else
{
return NotFound();
}
}
Test będzie
var httpActionResult = controller.Get(1);
Jak mogę po tym sprawdzić mój kod statusu http?
Odpowiedzi:
Oto
Ok()
tylko pomocnik dla typu,OkResult
który ustawia stan odpowiedzi naHttpStatusCode.Ok
... więc możesz po prostu sprawdzić, czy instancja wyniku działania jestOkResult
... kilka przykładów (napisanychXUnit
):źródło
Assert.IsInstanceOfType(httpActionResult, typeof(OkResult));
Created<T>(url,content)
jegoCreatedNegotiatedContentResult
Created
nie był dobrym przykładem dlaGet
operacji ... Zmieniłem teraz kod statusu na inny ...OkNegotiatedContentResult<T>
gdy przekażesz obiekt typuT
doOk()
return new StatusCodeResult((HttpStatusCode)422, this);
Czas wskrzesić martwe pytanie
Wszystkie bieżące odpowiedzi polegają na rzutowaniu obiektu odpowiedzi na znany typ. Niestety, odpowiedzi nie wydają się mieć użytecznej hierarchii lub niejawnej ścieżki konwersji, aby to działało bez dokładnej wiedzy o implementacji kontrolera. Rozważ następujące:
Testowanie zajęć:
Strumień odpowiedzi spoza czarnej skrzynki jest zasadniczo taki sam. Test musi wiedzieć, w jaki sposób kontroler zaimplementował wywołanie zwrotne, aby przetestować go w ten sposób.
Zamiast tego użyj obiektu HttpResponseMessage z zwróconego IHttpActionResult. Dzięki temu test może być spójny, nawet jeśli kod kontrolera może nie być:
źródło
new HttpRequestMessage() {Properties = { { HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration() } }}
To jest akceptowana odpowiedź Kirana Challa, dostosowana do NUnit;
źródło
https://docs.microsoft.com/en-us/aspnet/web-api/overview/testing-and-debugging/unit-testing-controllers-in-web-api#testing-actions-that-return-ihttpactionresult
Assert.IsInstanceOfType (httpActionResult, typeof (OkResult));
źródło
Jeśli IHttpActionResult zawiera obiekt JSON, np. {"Token": "A"}, możemy użyć następującego kodu.
źródło
Po kilku godzinach poszukiwań i prób w końcu zrozumiałem, jak w pełni przetestować moje metody Web API 2, które zwracają
IHttpActionResult
i używają oprogramowania pośredniego OWIN oraz domyślnej implementacji ASP.NET Identity.Będę testować
Get()
metodę na następującychApiController
:Zacznij od klasy bazowej, z której będą dziedziczyć wszystkie klasy testowe:
InitializeApiController
Sposób zawiera mięso i ziemniaki.Teraz możemy napisać nasze testy dla
AccountController
:Aby wszystko działało, musisz zainstalować kilka pakietów
Microsoft.OWIN.*
iMicrosoft.AspNet.*
wklejępackages.config
tutaj:Test jest bardzo prosty, ale pokazuje, że wszystko działa :-)
Miłego testowania!
źródło