2017-07-24 7 views
1

Ich versuche zu testen, ob mein http-Handler die richtigen Werte innerhalb des Körpers zurückgibt.Pufferzeichenfolge() nicht gleich Zeichenfolge

Dies ist meine Handler-Funktion

func Index(w http.ResponseWriter, r *http.Request){ 
    message := `{"status": "OK"}` 
    w.WriteHeader(http.StatusOK) 
    w.Header().Set("Content-Type", "application/json;charset=UTF-8") 
    if err := json.NewEncoder(w).Encode(message); err != nil { 
      panic(err) 
    } 
} 

Das ist mein Test

ist
func TestIndex(t *testing.T){ 

    req, err := http.NewRequest("GET", "/", nil) 
    if err != nil { 
      t.Fatal(err) 
    } 

    rr := httptest.NewRecorder() 
    handler := http.HandlerFunc(Index) 

    handler.ServeHTTP(rr, req) 

    expected := `"{"status": "OK"}"` 

    if rr.Body.String() != expected { 
    t.Errorf("handler returned unexpected body: got %v want %v", 
     rr.Body.String(), expected) 
    } 
} 

Das Ergebnis des Tests ist:

handlers_test.go:244: handler returned unexpected body: got "{\"status\": \"OK\"}" 
    want {"status": "OK"} 

ich glaube, das Entkommen der "ist, weil der json Encode, aber auch wenn ich die zu

0 0 ändern
expected := `"{\"status\": \"OK\"}"` 

es nicht funktioniert, als das Ergebnis des Tests ist

handlers_test.go:244: handler returned unexpected body: got "{\"status\": \"OK\"}" 
    want "{\"status\": \"OK\"}" 

Im docs ich etwas gefunden, das json kodieren eine Zeilenendmarke anhängt, aber ich habe es nicht geschafft, den Test zu bekommen arbeiten auch mit diese Information: -/

Im Voraus, danke für Ihre Hilfe.

+0

'erwartet: = \" "{" status ":" OK "} \" das hat ein extra "vor dem {. Könnte das ein Problem sein? –

+0

@Shinratensei: Danke für den Hinweis.Bearbeitete das Schnipsel, aber löste das Problem nicht :( – Kmmel

+0

Ja, ich weiß, es war nur etwas, das mir komisch aussah. Schau dir die Antworten an, sie wissen mehr über Golang –

Antwort

4

Die Nachricht, die Sie senden:

message := `{"status": "OK"}` 

Ist bereits ein gültiger JSON Text, Sie brauchen keine weiteren JSON-Codierung/Verarbeitung auf sie. Bitte senden Sie es einfach, wie sie ist:

func Index(w http.ResponseWriter, r *http.Request){ 
    message := `{"status": "OK"}` 
    w.Header().Set("Content-Type", "application/json;charset=UTF-8") 
    io.WriteString(w, message) 
} 

Beachten Sie auch, dass, wenn Ihr Antwortcode ist http.StatusOK, nicht explizit, dass festlegen müssen, wie der Standard ist, wenn Sie es nicht gesetzt.

Und dann erwarten einfach die folgende Antwort:

expected := `{"status": "OK"}` 

ursprüngliche Code Erklärung: {"status": "OK"} war einen einzigen string Wert, dessen Inhalts

In Ihrem ursprünglichen Code, den Sie JSON-gemarshallt. Bei der JSON-Codierung wird dieser Text in eine gültige JSON-Zeichenfolge (Präfix-Anführungszeichen mit einem umgekehrten Schrägstrich) eingefügt, in Anführungszeichen gesetzt und außerdem ein Zeilenvorschubzeichen angehängt. So wird dies der rohe string:

expected := `"{\"status\": \"OK\"}" 
` 

Mit diesem expected Wert, Ihr Test bestanden, aber wieder, was Sie wollen, ist im ersten Teil dieser Antwort.

Wenn Sie eine interpretierte Stringliteral zu beschreiben, die expected Wert verwenden möchten, ist dies, wie es aussehen könnte:

expected := "\"{\\\"status\\\": \\\"OK\\\"}\"\n" 
+0

Danke für die schnelle Antwort: änderte die erwartete aber \t handlers_test.go: 244: Handler gab unerwarteten Körper zurück: bekam "{\" Status \ ": \" OK \ "}" \t \t wollen {\ "status \": \ "OK \"} – Kmmel

+0

Danke, das hat es gelöst für diesen Test, aber ich bekam einen anderen, wo ich json.encode verwenden musste.Ich habe selbst eine Lösung für das Problem gefunden. – Kmmel

0

Die Zeilenumbrüche das Problem war. Ich habe es geschafft, es mit Strings zu lösen. TrimRight und schneiden, wenn direkt von der Zeichenfolge.

if strings.TrimRight(rr.Body.String(), "\n") != expected { 
    t.Errorf("handler returned unexpected body: got %v want %v", 
     rr.Body.String(), expected) 
    }