Heim > Backend-Entwicklung > Golang > Wie kann man bin.Contexts BindJSON für Go-Tests effektiv verspotten?

Wie kann man bin.Contexts BindJSON für Go-Tests effektiv verspotten?

Patricia Arquette
Freigeben: 2024-12-06 19:22:12
Original
300 Leute haben es durchsucht

How to Effectively Mock gin.Context's BindJSON for Go Testing?

Mock gin.Context für BindJSON in Go festlegen

Einführung

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.

Gin.Context verspotten

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),
    }
Nach dem Login kopieren

POST-JSON-Körper verspotten

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))
}
Nach dem Login kopieren

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.

Beispielverwendung

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)
} 
Nach dem Login kopieren

Zusätzliche Hinweise

Weitere Informationen zum Testen von Gin-Handlern finden Sie im Folgenden Ressource:

  • Wie teste ich eine Go Gin-Handler-Funktion in einem Unit-Test?

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage