Тестирование конечной точки загрузки из нескольких частей в Echo Framework - PullRequest
0 голосов
/ 24 января 2020

Я использую Echo Framework Labstack для создания API в Golang. Теперь у меня есть проблема, с которой я не могу обойтись, когда хочу проверить конечную точку.

У меня есть такая функция-обработчик

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 ...
    }
}

Кажется, я не могу получить значения формы в обработчик. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 27 января 2020

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 фактически записывает идентификатор границы в тело (что является очень важной частью!). Этот идентификатор позже записывается в заголовки с использованием writer.FormDataContentType ().

Дело в том, что вы вызываете FormValue, FormFile и т. Д. c. go вызывает req.ParseMultipartForm (), который, в свою очередь, go и ищет идентификатор границы в заголовке multipart / form-data, а затем использует указанный идентификатор для поиска данных тела.

...