Maison >développement back-end >Golang >Comment simuler les erreurs de lecture du corps de réponse avec httptest ?

Comment simuler les erreurs de lecture du corps de réponse avec httptest ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-27 01:05:30485parcourir

How to Simulate Response Body Read Errors with httptest?

Simulation des erreurs lors de la lecture du corps de la réponse avec httptest

Lors du test des clients HTTP avec httptest, il peut être nécessaire de simuler des erreurs lors du corps de la réponse lire.

Considérez la fonction wrapper suivante qui consomme les corps de réponse :

<code class="go">package req

func GetContent(url string) ([]byte, error) {
    response, err := httpClient.Get(url)
    // some header validation goes here
    body, err := ioutil.ReadAll(response.Body)
    defer response.Body.Close()

    if err != nil {
        errStr := fmt.Sprintf("Unable to read from body %s", err)
        return nil, errors.New(errStr)
    }

    return body, nil
}</code>

Pour tester cette fonction, un faux serveur peut être configuré à l'aide de httptest :

<code class="go">package req_test

import (
    "net/http"
    "net/http/httptest"
    "testing"
)

func Test_GetContent_RequestBodyReadError(t *testing.T) {

    handler := func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
    }

    ts := httptest.NewServer(http.HandlerFunc(handler))
    defer ts.Close()

    _, err := GetContent(ts.URL)

    if err != nil {
        t.Log("Body read failed as expected.")
    } else {
        t.Fatalf("Method did not fail as expected")
    }

}</code>

Pour forcer une erreur de lecture, il est essentiel de comprendre le comportement de Response.Body à partir de la documentation :

// Body represents the response body.
//
// ...
// If the network connection fails or the server terminates the response, Body.Read calls return an error.

Par conséquent, un moyen simple de simuler une erreur consiste à créer une réponse HTTP non valide à partir du gestionnaire de test . Par exemple, mentir sur la longueur du contenu peut provoquer une erreur EOF inattendue du côté client.

Un exemple d'un tel gestionnaire :

<code class="go">handler := func(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Length", "1")
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn