在使用 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中文网其他相关文章!