利用go test测试文件上传

我们都知道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"包

  1. 首先创建一个writer
    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)
  1. 然后往multipart中写入域"my_file"和文件名filepath.Base(path)

"my_file"和服务端中
file, head, err := r.FormFile("my_file")
对应。

3.最后上传文件


    io.Copy(part, file)
    writer.Close()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,256评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,539评论 25 709
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,649评论 7 249
  • 喜欢听着老歌,看着老照片, 喜欢一个人独处时候的安静,唯有如此,貌似我才能好好静下心来好好想想自己的人生。 现在的...
    诺卟轻许阅读 335评论 1 0
  • 我是一个不勤快的懒惰人。很多时候脑子已经飞奔到脚趾尖,行动还依然悠哉在脑神经的曲线上。它总是不慌不忙,有时又...
    庶宁阅读 180评论 0 0