2016-08-02 14 views
0

einen Komponententest schreiben einen Controller zu schlagen, ist der Code für den Controller:Wie kann ich testen, ob eine HttpResponseMessage eine ErrorResponse ist?

public HttpResponseMessage InsertByKittyId(..... 
    ... 
    if (result.Success) 
     return Request.CreateResponse(HttpStatusCode.OK); 
    else 
     return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, new Exception(result.Message)); 

In meiner Einheit Test sollte es eine Fehlermeldung mit dem Code generieren:

var response = kittenController.InsertByKittenId(123); 

Assert that response is an Error Response ? 
var exceptionResult = (Error Response)response; ? 
Assert.AreEqual("Bad Kitty", exceptionResult.Exception.Message); 

Gibt es eine Möglichkeit um die zwei Zeilen mit einem? zu schreiben, oder sollte ich überprüfen, ob der Antwortcode nicht 2xx ist und den Fehleraspekt vollständig ignorieren? Wenn das der Fall ist, muss ich einen Weg finden, die Ausnahme zu entfernen.

Edit:

Ich frage mich, ob es einen Weg zwischen CreateResponse und CreateErrorResponse eher an der Fehlercode als die Suche zu unterscheiden ist, weil in einigen Fällen ich eine Ausnahme anhängen möchten und in einigen Fällen ist es nicht ein "Fehler" an sich.

Sonst könnte ich nur Request.CreateResponse(HttpStatusCode.InternalServerError);

aber vielleicht gibt es keinen Unterschied?

+0

Es sollte eine "IsSuccess" -Eigenschaft sein, nein? –

+0

Es gibt, aber ich denke, in einigen Situationen wird es keine Ausnahme geben? Zum Beispiel garantiert 404 keine Ausnahme oder einen Fehler. – NibblyPig

+0

Nun, das hängt davon ab, was außergewöhnliche Umstände sind und was Sie in sie aufnehmen. Sie stellen entweder eine '200' oder eine' 500' ein, also warum behaupten Sie nicht einfach, dass diese existieren. Ist es wirklich wichtig, dass die Ausnahme in Ihrem Test bestätigt wird? Ich erwarte, dass Sie Ihre 500-Ausnahme nicht in die Client-App (Browser oder App) einbinden lassen. Sie sind nur für den internen Gebrauch, also würde ich erwarten, dass einige Middleware diese herausziehen und keine Nachricht geben. (was ich tue) –

Antwort

0
Assert.IsTrue(response.StatusCode.ToString()[0] == '2'); 

Das wird prüfen, ob es ein 2xx Fehler ist.

Assert.IsTrue(response.IsSuccessStatusCode); 

Das wird allgemeiner überprüfen, wenn es einen Fehler gab.

1

Es gibt zwei Ansätze.

Die erste ist, dass Sie überprüfen können, ob der Statuscode mit "2" beginnt, würde es in etwa so aussehen.

Der zweite Ansatz besteht darin, die IsSuccessStatusCode-Eigenschaft der Antwort zu verwenden und dies zu überprüfen.

!response.IsSuccessStatusCode