📝
GoでCSVをzipにする&テストを書く
GoでCSVをZIPにしてアップロードする際、実装やテストに悩んだのでメモしておきます。
CSVをzipにする
main.go
package main
import (
"archive/zip"
"bytes"
"encoding/csv"
)
func main() {
buffer := new(bytes.Buffer)
if err := MakeZipFile(buffer); err != nil {
return
}
}
func MakeZipFile(buffer *bytes.Buffer) error {
zipWriter := zip.NewWriter(buffer)
file, err := zipWriter.Create("sample.txt")
if err != nil {
return err
}
csvWriter := csv.NewWriter(file)
csvWriter.Write([]string{"id", "name", "address", "birthday", "gender"})
csvWriter.Flush()
if err := zipWriter.Close(); err != nil {
return err
}
return nil
}
テストを書く
main_test.go
package main
import (
"archive/zip"
"bytes"
"fmt"
"testing"
)
func TestMakeZipFile(t *testing.T) {
t.Run("main test", func(t *testing.T) {
buffer := new(bytes.Buffer)
MakeZipFile(buffer)
// zipを読み込むためのreaderを生成する
r, err := zip.NewReader(bytes.NewReader(buffer.Bytes()), int64(len(buffer.Bytes())))
if err != nil {
t.Error("error")
}
// outputの変数に読み込ませる
output := bytes.Buffer{}
rc, err := r.File[0].Open()
t.Cleanup(func() { rc.Close() })
output.ReadFrom(rc)
actual := string(output.Bytes())
expect := `id,name,address,birthday,gender
`
if actual != expect {
t.Error("\nactual: ", actual, "\nexpect: ", expect)
}
})
}
Discussion