Как проверить функцию HTTP, которая принимает папку в качестве входа? - PullRequest
1 голос
/ 15 апреля 2019

У меня есть функция обработчика HTTP (POST), которая позволяет пользователю загружать папку из приложения веб-браузера.Папка передается из кода JavaScript как массив файлов в папке, а на бэкэнде (Go API) она принимается как []*multipart.FileHeader.Я пытаюсь написать модульный тест Go для этой функции.Как я могу передать папку как ввод из тестовой функции?Мне нужна помощь в создании httpRequest в правильном формате.

Я попытался использовать / установить значения для массива FileHeader, но некоторые атрибуты не разрешено импортировать.Поэтому должен быть другой способ тестирования этого обработчика, о котором я не знаю.

Функция обработчика для загрузки в папку:

func FolderUpload(w http.ResponseWriter, r *http.Request, p httprouter.Params) { 
// SOME LOGIC

files := r.MultipartForm.File["multiplefiles"] // files is of the type []*multipart.FileHeader

// SOME LOGIC TO PARSE THE FILE NAMES TO RECREATE THE SAME TREE STRUCTURE ON THE SERVER-SIDE AND STORE THEM AS A FOLDER

Функция модульного теста для того же обработчика:

func TestFolderUpload(t *testing.T) {
//     FolderPreCondition()
     request, err := http.NewRequest("POST", uri, body) //Q: HOW TO CREATE THE BODY ACCEPTABLE BY THE ABOVE HANDLER FUNC?
//     SOME ASSERTION LOGIC
}

1 Ответ

2 голосов
/ 15 апреля 2019

Вы должны написать свой файл для запроса:

func newFileUploadRequest(url string, paramName, path string) (*http.Request, error) {
file, err := os.Open(path)

if err != nil {
    return nil, err
}

defer file.Close()

body := new(bytes.Buffer)

writer := multipart.NewWriter(body)

part, err := writer.CreateFormFile(paramName, filepath.Base(path))

if err != nil {
    return nil, err
}

_, err = io.Copy(part, file)

if err != nil {
    return nil, err
}

err = writer.Close()
if err != nil {
    return nil, err
}
req, err := http.NewRequest("POST", url, body)

if err != nil {
    return nil, err
}

req.Header.Add("Content-Type", writer.FormDataContentType())

return req, err

}

, а затем использовать его:

    req, err := newFileUploadRequest("http://localhost:1234/upload", "multiplefiles", path)

client := &http.Client{}

resp, err := client.Do(req)

Это работает для меня, надеюсь, это поможет вам)

...