gpt4 book ai didi

go - 在 Echo 框架中测试多部分表单上传端点

转载 作者:行者123 更新时间:2023-12-01 20:27:10 25 4
gpt4 key购买 nike

我正在使用 labstack 的 Echo framework用于在 Golang 中构建 API。现在我遇到了一个问题,当我想测试端点时似乎无法解决。

我有一个这样的处理函数

func DoStuff(c echo.Context) error {
businessUnit := strings.ToUpper(c.FormValue("bu"))
week := c.FormValue("wk")

file, _ := c.FormFile("file")

...
}

处理程序工作得很好。我现在的问题是为此编写集成测试。

此端点接受 Content-Type: multipart/form-data .

以下是我的一些其他处理程序测试的外观:
func TestDoStuff(t *testing.T) {

// Not sure about this part tho
body := new(bytes.Buffer)
writer := multipart.NewWriter(body)
writer.WriteField("bu", "HFL")
writer.WriteField("wk", "10")
part, _ := writer.CreateFormFile("file", "file.csv")
part.Write([]byte(`sample`))


e := echo.New()
req := httptest.NewRequest(http.MethodPost, "/endpoint", body)
req.Header.Add("Content-Type", "multipart/form-data")
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)

if assert.NotPanics(t, func(){ _ = DoStuff(c)}){
assert.Equal(t, http.StatusOK, rec.Code)
... more assertions ...
}
}

我似乎无法在处理程序中获取表单值。任何帮助将不胜感激。

最佳答案

TLDR

func TestDoStuff(t *testing.T) {
body := new(bytes.Buffer)
writer := multipart.NewWriter(body)
writer.WriteField("bu", "HFL")
writer.WriteField("wk", "10")
part, _ := writer.CreateFormFile("file", "file.csv")
part.Write([]byte(`sample`))
writer.Close() // <<< important part

e := echo.New()
req := httptest.NewRequest(http.MethodPost, "/endpoint", body)
req.Header.Set("Content-Type", writer.FormDataContentType()) // <<< important part
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
...
}

解释。
当您关闭 multipart.Writer 时,实际上将边界 id 写入正文(这是非常重要的部分!)。该 id 稍后使用 writer.FormDataContentType() 写入 header 。

问题是当您调用 FormValue、FormFile 等时,go 调用 req.ParseMultipartForm(),后者又会在 multipart/form-data header 中查找边界 id,然后使用所述 id 搜索正文数据。

关于go - 在 Echo 框架中测试多部分表单上传端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com