我想将 csv 包用于一个大型项目,并且我从一些基本测试开始。当输出看起来与预期输出匹配时,我无法弄清楚为什么这个单元测试失败了。
文件:
package csv
import (
"bytes"
"encoding/csv"
)
func generatecsv(records [][]string) (string, error) {
buf := bytes.buffer{}
w := csv.newwriter(&buf)
for _, record := range records {
if err := w.write(record); err != nil {
// handle the err
}
}
w.flush()
if err := w.error(); err != nil {
// handle the error
}
return buf.string(), nil
}
测试文件:
package csv
import "testing"
func testgeneratecsv(t *testing.t) {
records := [][]string{
{"first_name","last_name","user_name"},
}
type args struct {
records [][]string
}
tests := []struct {
name string
args args
want string
wanterr bool
}{
// todo: add test cases.
{"t1", args{records: records,}, "first_name,last_name,user_name", false},
}
for _, tt := range tests {
t.run(tt.name, func(t *testing.t) {
got, err := generatecsv(tt.args.records)
if (err != nil) != tt.wanterr {
t.errorf("generatecsv() error = %v, wanterr %v", err, tt.wanterr)
return
}
if got != tt.want {
t.errorf("generatecsv() = %v, want %v", got, tt.want)
}
})
}
当测试运行时,我得到以下输出:
FAIL: TestGenerateCSV
GenerateCSV() = first_name,last_name,user_name
, want first_name,last_name,user_name
看起来测试输出正是我所要求的?谁能帮我找出我做错了什么?
正确答案
要捕获错误,请在测试代码中添加此检查。
if len(got) != len(tt.want) {
t.Errorf("GenerateCSV() string len = %v, want length %v", len(got), len(tt.want))
return
}
原因:当您使用w.flush写入记录时,它会添加一个新行。