首页 >后端开发 >Golang >如何在 Go Http.Request.FormFile 测试中模拟文件上传?

如何在 Go Http.Request.FormFile 测试中模拟文件上传?

Patricia Arquette
Patricia Arquette原创
2024-11-03 08:21:021046浏览

How to Simulate File Upload in Go Http.Request.FormFile Tests?

测试 Go Http.Request.FormFile

测试需要多部分表单数据的端点需要模拟文件上传。这可以通过使用 httptest 库生成带有表单文件的 post 请求来实现。

我们可以利用 mime/multipart 包来创建表单文件,而不是模拟完整的 FormFile 结构。 CreateFormFile 函数生成一个指定字段名和文件名的多部分字段头。

通过将 CreateFormFile 创建的 io.Writer 传递给 httptest.NewRequest,我们可以用表单文件模拟 post 请求。

以下是如何实现的示例:

<code class="go">func TestUploadImage(t *testing.T) {
    // Set up an io.Pipe to avoid buffering
    pr, pw := io.Pipe()
    writer := multipart.NewWriter(pw)

    go func() {
        defer writer.Close()
        part, err := writer.CreateFormFile("fileupload", "someimg.png")
        if err != nil {
            t.Error(err)
        }
        img := createImage()
        err = png.Encode(part, img)
        if err != nil {
            t.Error(err)
        }
    }()

    request := httptest.NewRequest("POST", "/", pr)
    request.Header.Add("Content-Type", writer.FormDataContentType())

    response := httptest.NewRecorder()
    handler := UploadFileHandler()
    handler.ServeHTTP(response, request)

    if response.Code != 200 {
        t.Errorf("Expected %s, received %d", 200, response.Code)
    }
    if _, err := os.Stat("./uploads/someimg.png"); os.IsNotExist(err) {
        t.Error("Expected file ./uploads/someimg.png' to exist")
    }
}</code>

此函数使用图像包动态创建图像,并使用 png.Encode 将其直接写入多部分 Writer。这模拟了图像文件的上传,而不需要实际的文件 I/O。

以上是如何在 Go Http.Request.FormFile 测试中模拟文件上传?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn