Nehmen wir an, dies ist meine Aktionsmethode
public IHttpActionResult Get(int id)
{
var status = GetSomething(id);
if (status)
{
return Ok();
}
else
{
return NotFound();
}
}
Test wird sein
var httpActionResult = controller.Get(1);
Wie überprüfe ich danach meinen http-Statuscode?
Antworten:
Hier
Ok()
ist nur eine Hilfe für den Typ,OkResult
der den Antwortstatus aufHttpStatusCode.Ok
... setzt. Sie können also einfach überprüfen, ob die Instanz Ihres Aktionsergebnisses einOkResult
... einige Beispiele (geschrieben inXUnit
) ist:quelle
Assert.IsInstanceOfType(httpActionResult, typeof(OkResult));
Created<T>(url,content)
seineCreatedNegotiatedContentResult
Created
war wahrscheinlich kein gutes Beispiel für eineGet
Operation ... ich habe den Statuscode jetzt in einen anderen geändert ...OkNegotiatedContentResult<T>
wenn Sie ein Objekt vom TypT
anOk()
return new StatusCodeResult((HttpStatusCode)422, this);
Zeit, eine tote Frage wiederzubeleben
Die aktuellen Antworten basieren alle darauf, das Antwortobjekt in einen bekannten Typ umzuwandeln. Leider scheinen die Antworten keine verwendbare Hierarchie oder keinen impliziten Konvertierungspfad zu haben, damit dies ohne genaue Kenntnis der Controller-Implementierung funktioniert. Folgendes berücksichtigen:
Testen der Klasse:
Von außerhalb der Black Box ist der Antwortstrom im Wesentlichen der gleiche. Der Test muss wissen, wie der Controller den Rückruf implementiert hat, um ihn auf diese Weise zu testen.
Verwenden Sie stattdessen das HttpResponseMessage-Objekt aus dem zurückgegebenen IHttpActionResult. Dies stellt sicher, dass der Test konsistent sein kann, auch wenn der Controller-Code möglicherweise nicht wie folgt lautet:
quelle
new HttpRequestMessage() {Properties = { { HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration() } }}
Dies ist die akzeptierte Antwort von Kiran Challa, angepasst für NUnit;
quelle
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));
quelle
Wenn IHttpActionResult ein JSON-Objekt enthält, z. B. {"token": "A"}, können wir den folgenden Code verwenden.
quelle
Nach einigen Stunden Recherche und Versuchen habe ich endlich herausgefunden, wie ich meine Web-API-2-Methoden,
IHttpActionResult
die die OWIN-Middleware und die Standardimplementierung von ASP.NET Identity zurückgeben und verwenden , vollständig testen kann .Ich werde die
Get()
Methode folgendermaßen testenApiController
:Beginnen Sie mit einer Basisklasse, von der alle Testklassen erben:
Die
InitializeApiController
Methode enthält das Fleisch und die Kartoffeln.Jetzt können wir unsere Tests schreiben für
AccountController
:Für alles , was zu arbeiten, müssen Sie eine Reihe von installieren
Microsoft.OWIN.*
undMicrosoft.AspNet.*
Pakete, ich werde meine fügen sichpackages.config
hier:Der Test ist sehr einfach, zeigt aber, dass alles funktioniert :-)
Viel Spaß beim Testen!
quelle