登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-18 11:00:30 331浏览 收藏

在 Echo 框架中测试利用多部分表单上传端点的集成测试时,需要手动构建 multipart/form-data 请求正文并设置正确的 Content-Type 标头。关闭 multipart.writer 并使用 writer.formdatacontenttype() 获取正确的边界 ID 至关重要,以确保处理程序能够正确解析表单值。

问题内容

我正在使用 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 ...
    }
}

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


解决方案


太长了

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 等时,go 会调用 req.parsemultipartform(),req.parsemultipartform() 又会在 multipart/form-data 标头中查找边界 id,然后使用所述 id 搜索正文数据。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>