Das Binden von JSON-Daten an eine Struktur während HTTP-Anfragen ist eine häufige Aufgabe in Webanwendungen . Es kann schwierig werden, ein Test-Framework zu verwenden, bei dem der Anforderungskontext simuliert werden muss. Insbesondere das Verspotten von gin.Context bereitet Schwierigkeiten, wenn versucht wird, Funktionen zu testen, die auf seiner BindJSON-Methode basieren. Dieser Artikel bietet eine umfassende Lösung für dieses Problem.
Zunächst ist es wichtig, einen Test-gin.Context zu instanziieren und dessen http.Request auf ungleich Null zu setzen:
w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) c.Request = &http.Request{ Header: make(http.Header), }
Als nächstes können wir einen POST-JSON-Körper verspotten, indem wir verwenden Folgende Funktion:
func MockJsonPost(c *gin.Context /* the test context */, content interface{}) { c.Request.Method = "POST" // or PUT c.Request.Header.Set("Content-Type", "application/json") jsonbytes, err := json.Marshal(content) if err != nil { panic(err) } // the request body must be an io.ReadCloser // the bytes buffer though doesn't implement io.Closer, // so you wrap it in a no-op closer c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonbytes)) }
Diese Funktion akzeptiert einen Content-Interface{}-Parameter, der mit json.Marshal() in JSON gemarshallt werden kann. Dies könnte eine Struktur mit entsprechenden JSON-Tags oder eine Map[string]Schnittstelle{} sein.
So verwenden Sie die MockJsonPost-Funktion in einem Test:
func TestMyHandler(t *testing.T) { w := httptest.NewRecorder() ctx, _ := gin.CreateTestContext(w) ctx.Request = &http.Request{ Header: make(http.Header), } MockJsonPost(ctx, map[string]interface{}{"foo": "bar"}) MyHandler(ctx) assert.EqualValues(t, http.StatusOK, w.Code) }
Weitere Informationen zum Testen von Gin-Handlern finden Sie im Folgenden Ressource:
Das obige ist der detaillierte Inhalt vonWie kann man bin.Contexts BindJSON für Go-Tests effektiv verspotten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!