go - 在 Echo 框架中测试多部分表单上传端点
问题描述
我正在使用 labstack 的Echo 框架在 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 写入正文(这是非常重要的部分!)。稍后使用 writer.FormDataContentType() 将该 ID 写入标头。
问题是当您调用 FormValue、FormFile 等时,会调用 req.ParseMultipartForm(),后者又会在 multipart/form-data 标头中查找边界 id,然后使用所述 id 搜索正文数据。
推荐阅读
- python - 如何串联订购 3 列?蟒蛇熊猫
- sql-server - SQL Server 日期时间值表示为带有时区指示符的 UTC
- javascript - 使用 xpath 条件获取网页中的所有链接
- javascript - 闪屏反应原生
- gradle - Intellij Idea - 按项目定义自定义和不同的 Gradle 用户主页
- gitlab - GitLab CI - 独立环境部署和语义发布
- python - pygame 射手子弹落后
- mysql - MySQL:连接三个表,比较两个值
- ios - 某些文档的 Firebase Cloud Firestore 安全规则
- r - 如何使用 R 访问 Youtube Data API v3