1

我有一个 HTTP 处理函数 (POST),它允许用户从 Web 浏览器应用程序上传文件夹。该文件夹是从 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
}
4

1 回答 1

3

您应该编写文件以请求:

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)

对我有用,希望对你有帮助)

于 2019-04-15T09:08:26.357 回答