在使用http.Request.FormFile 測試涉及檔案上傳的端點時,有必要產生一個帶有值的請求可以透過此方法檢索。
httptest 函式庫沒有提供直接的方法來模擬完整的 FormFile 結構。但是,使用mime/multipart 套件,您可以使用CreateFormFile 函數建立FormFile:
<code class="go">func (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error)</code>
此函數採用欄位名稱和檔案名稱作為參數,並傳回您可以使用的io.Writer寫入實際的檔案資料。
要在測試中使用 CreateFormFile,您可以將資料寫入 io.ReaderWriter 緩衝區或使用 io.Pipe。以下範例使用 io.Pipe:
<code class="go">func TestUploadImage(t *testing.T) { // Set up a pipe to avoid buffering pr, pw := io.Pipe() // Create a multipart form data writer using the pipe as the destination writer := multipart.NewWriter(pw) go func() { defer writer.Close() // Create the 'fileupload' form data field part, err := writer.CreateFormFile("fileupload", "someimg.png") if err != nil { t.Error(err) } // Write an image to the form data field using an io.Writer interface // (e.g., png.Encode) }() // Read from the pipe, which contains the multipart form data generated by the multipart writer request := httptest.NewRequest("POST", "/", pr) request.Header.Add("Content-Type", writer.FormDataContentType()) response := httptest.NewRecorder() handler := UploadFileHandler() handler.ServeHTTP(response, request) // Assert HTTP status code and other test verifications }</code>
此範例使用映像包動態產生映像文件,並透過 io.Writer 介面將其寫入多部分寫入器。您也可以使用類似的方法動態建立其他格式(例如 CSV)的資料。
以上是如何在 Go 測試中模擬 `http.Request.FormFile`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!