httptest で読み取られた応答本文のエラーをシミュレートする
httptest で HTTP クライアントをテストする場合、応答本文中にエラーをシミュレートする必要がある場合があります。 read.
レスポンスボディを消費する次のラッパー関数を考えてみましょう:
<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>
この関数をテストするには、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>
読み取りエラーを強制するには、ドキュメントから Response.Body の動作を理解することが重要です:
// Body represents the response body. // // ... // If the network connection fails or the server terminates the response, Body.Read calls return an error.
したがって、エラーをシミュレートする簡単な方法は、テスト ハンドラーから無効な HTTP 応答を作成することです。 。たとえば、コンテンツの長さについて嘘をついた場合、クライアント側で予期しない EOF エラーが発生する可能性があります。
そのようなハンドラーの例:
<code class="go">handler := func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Length", "1") }</code>
以上がhttptest でレスポンスボディ読み取りエラーをシミュレートするには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。