>백엔드 개발 >Golang >웹 엔드포인트를 테스트하기 위해 Go에서 `http.Request.FormFile`을 어떻게 모의할 수 있나요?

웹 엔드포인트를 테스트하기 위해 Go에서 `http.Request.FormFile`을 어떻게 모의할 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-11-04 04:10:01823검색

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

Go 테스트: Request.FormFile 모의

Go 웹 엔드포인트를 테스트하는 과정에서 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/멀티파트 패키지와 파이프를 활용하면 업로드된 파일이 포함된 요청을 효율적으로 시뮬레이션하고 엔드포인트를 철저하게 테스트할 수 있습니다.

위 내용은 웹 엔드포인트를 테스트하기 위해 Go에서 `http.Request.FormFile`을 어떻게 모의할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.