【问题标题】:Testing a multipart form upload endpoint in Echo framework在 Echo 框架中测试多部分表单上传端点
【发布时间】:2020-01-28 00:03:25
【问题描述】:

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

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

【问题讨论】:

    标签: go integration-testing go-echo


    【解决方案1】:

    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() 写入标头。

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

    【讨论】:

    • 非常感谢,让我测试一下
    • 我忘了关闭我的作家!非常感谢!
    • @jcobhams 请将此答案标记为已接受
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多