Web エンドポイントをテストするために Go で `http.Request.FormFile` をモックするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-04 04:10:01
オリジナル
750 人が閲覧しました

How can I mock `http.Request.FormFile` in Go for testing web endpoints?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!