Как вызвать ошибку при чтении тела ответа - PullRequest
0 голосов
/ 06 ноября 2018

Я написал оболочку http-клиента в go, и мне нужно тщательно ее протестировать. Я читаю тело ответа с ioutil.ReadAll внутри оболочки. У меня возникли проблемы с выяснением того, как заставить принудительно завершить чтение из тела ответа с помощью httptest.

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
}

Я предполагаю, что могу настроить фальшивый сервер следующим образом:

package req_test

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")
    }

}

Я предполагаю, что мне нужно изменить ResposeWriter. Теперь можно ли как-нибудь изменить responseWriter и, таким образом, принудительно завершить работу ioutil.ReadAll в оболочке?

Я понимаю, что вы, кажется, думаете, что это дубликат этого поста , и хотя вы можете в это верить или, возможно, просто пометить его как дубликат не очень мне поможет. Код, приведенный в ответах в «повторяющемся» посте, не имеет для меня особого смысла.

1 Ответ

0 голосов
/ 06 ноября 2018

Проверьте документацию Response.Body, чтобы увидеть, что при чтении из нее может появиться ошибка:

// Body represents the response body.
//
// The response body is streamed on demand as the Body field
// is read. If the network connection fails or the server
// terminates the response, Body.Read calls return an error.
//
// The http Client and Transport guarantee that Body is always
// non-nil, even on responses without a body or responses with
// a zero-length body. It is the caller's responsibility to
// close Body. The default HTTP client's Transport may not
// reuse HTTP/1.x "keep-alive" TCP connections if the Body is
// not read to completion and closed.
//
// The Body is automatically dechunked if the server replied
// with a "chunked" Transfer-Encoding.
Body io.ReadCloser

Самый простой способ - создать недопустимый HTTP-ответ из обработчика теста.

Как это сделать? Есть много способов, простой из которых заключается в том, чтобы «врать» о длине контента:

handler := func(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Length", "1")
}

Этот обработчик сообщает, что имеет 1-байтовое тело, но на самом деле он не отправляет ни одного. Таким образом, на другом конце (клиент) при попытке прочитать 1 байт из него, очевидно, что это не удастся, и приведет к следующей ошибке:

Unable to read from body unexpected EOF

См. Связанный вопрос, если вам необходимо смоделировать чтение ошибок из тела запроса (не из тела ответа): Как проверить ошибку при чтении из тела запроса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...