我们都知道go语言的testing包提供了丰富的测试功能,方便我们在开发时进行单元测试,但是之前一直没有看到过如何进行文件上传单元测试相关的文章,直到看到了B站的这个视频「教程」Go语言基础 (O'Reilly),不得不说这个go语言学习视频比国内的不知要高到哪里去了,讲解清晰,涵盖范围广,学完感觉水平瞬间上了一个等级。
文件上传服务端代码
func upload(w http.ResponseWriter, r *http.Request) {
file, head, err := r.FormFile("my_file")
if err != nil {
fmt.Sprintln(err)
fmt.Fprintln(w, err)
return
}
localFileDir := "/tmp/upload/"
err = os.MkdirAll(localFileDir, 0777)
if err != nil {
fmt.Sprintln(err)
fmt.Fprintln(w, err)
return
}
localFilePath := localFileDir + head.Filename
localFile, err := os.Create(localFilePath)
if err != nil {
fmt.Sprintln(err)
fmt.Fprintln(w, err)
return
}
defer localFile.Close()
io.Copy(localFile, file)
fmt.Fprintln(w, localFilePath)
}
测试代码
func TestUpload(t *testing.T) {
path := "/home/ubuntu/test.go"//要上传文件所在路径
file, err := os.Open(path)
if err != nil {
t.Error(err)
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("my_file", filepath.Base(path))
if err != nil {
writer.Close()
t.Error(err)
}
io.Copy(part, file)
writer.Close()
req := httptest.NewRequest("POST", "/upload", body)
req.Header.Set("Content-Type", writer.FormDataContentType())
res := httptest.NewRecorder()
upload(res, req)
if res.Code != http.StatusOK {
t.Error("not 200")
}
t.Log(res.Body.String())
// t.Log(io.read)
}
测试代码中关键的部分在于使用了"mime/multipart"包
- 首先创建一个writer
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
- 然后往multipart中写入域"my_file"和文件名filepath.Base(path)
"my_file"和服务端中
file, head, err := r.FormFile("my_file")
对应。
3.最后上传文件
io.Copy(part, file)
writer.Close()