Go のテスト: Request.FormFile のモック
Go Web エンドポイントをテストする過程で、http をモックするという課題に遭遇する場合があります。 Request.FormFile フィールド。このフィールドはリクエスト内のアップロードされたファイルを表し、エンドポイントの機能をテストするために不可欠です。
これに対処するには、http.Request.FormFile 構造体全体をモックすることを検討してください。ただし、これは不必要な手順です。 mime/multipart パッケージは、より効率的なアプローチを提供します。
mime/multipart パッケージは、FormFile インスタンスを生成できる Writer タイプを提供します。ドキュメントに記載されているように:
CreateFormFile is a convenience wrapper around CreatePart. It creates a new form-data header with the provided field name and file name.
CreateFormFile 関数は、FormFile フィールドの構築に使用できる io.Writer を返します。この io.Writer は、リーダーを引数として受け入れる httptest.NewRequest に引数として渡すことができます。
この手法を実装するには、FormFile を io.ReaderWriter バッファに書き込むか、 io.パイプ。次の例は、後者のアプローチを示しています。
<code class="go">import ( "fmt" "io" "io/ioutil" "net/http" "net/http/httptest" "github.com/codegangsta/multipart" ) func TestUploadFile(t *testing.T) { // Create a pipe to avoid buffering pr, pw := io.Pipe() // Create a multipart writer to transform data into multipart form data writer := multipart.NewWriter(pw) go func() { defer writer.Close() // Create the form data field 'fileupload' with a file name part, err := writer.CreateFormFile("fileupload", "someimg.png") if err != nil { t.Errorf("failed to create FormFile: %v", err) } // Generate an image dynamically and encode it to the multipart writer img := createImage() err = png.Encode(part, img) if err != nil { t.Errorf("failed to encode image: %v", err) } }() // Create an HTTP request using the multipart writer and set the Content-Type header request := httptest.NewRequest("POST", "/", pr) request.Header.Add("Content-Type", writer.FormDataContentType()) // Create a response recorder to capture the response response := httptest.NewRecorder() // Define the handler function to test handler := func(w http.ResponseWriter, r *http.Request) { // Parse the multipart form data if err := r.ParseMultipartForm(32 << 20); err != nil { http.Error(w, "failed to parse multipart form data", http.StatusBadRequest) return } // Read the uploaded file file, header, err := r.FormFile("fileupload") if err != nil { if err == http.ErrMissingFile { http.Error(w, "missing file", http.StatusBadRequest) return } http.Error(w, fmt.Sprintf("failed to read file: %v", err), http.StatusInternalServerError) return } defer file.Close() // Save the file to disk outFile, err := os.Create("./uploads/" + header.Filename) if err != nil { http.Error(w, fmt.Sprintf("failed to save file: %v", err), http.StatusInternalServerError) return } defer outFile.Close() if _, err := io.Copy(outFile, file); err != nil { http.Error(w, fmt.Sprintf("failed to copy file: %v", err), http.StatusInternalServerError) return } w.Write([]byte("ok")) } // Serve the request with the handler function handler.ServeHTTP(response, request) // Verify the response status code and file creation if response.Code != http.StatusOK { t.Errorf("incorrect HTTP status: %d", response.Code) } if _, err := os.Stat("./uploads/someimg.png"); os.IsNotExist(err) { t.Errorf("failed to create file: ./uploads/someimg.png") } else if body, err := ioutil.ReadAll(response.Body); err != nil { t.Errorf("failed to read response body: %v", err) } else if string(body) != "ok" { t.Errorf("incorrect response body: %s", body) } }</code>
この例では、モック FormFile の生成から応答ステータス コードのアサートとファイルの作成まで、ファイルのアップロードを処理するエンドポイントをテストするための完全なフローを示します。 mime/multipart パッケージとパイプを利用することで、アップロードされたファイルを含むリクエストを効率的にシミュレートし、エンドポイントを徹底的にテストできます。
以上がWeb エンドポイントをテストするために Go で `http.Request.FormFile` をモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。