我经常使用这个简单的函数来检查错误:
// ErrorContains checks if the error message in out contains the text in
// want.
//
// This is safe when out is nil. Use an empty string for want if you want to
// test that err is nil.
func ErrorContains(out error, want string) bool {
if out == nil {
return want == ""
}
if want == "" {
return false
}
return strings.Contains(out.Error(), want)
}
示例用法:
if !ErrorContains(err, "unexpected banana") {
t.Errorf("unexpected error: %v", err)
}
if !ErrorContains(err, "") {
t.Errorf("unexpected error: %v", err)
}
我发现这在表驱动测试中特别有用,因为我可以执行以下操作:
tests := struct{
want string
wantErr string
}{
{
"some output",
"", // No error expected
},
{
"",
"out of coconuts",
}
}
它避免了与nil、errors.New() 之类的混淆。
我使用string.Contains() 而不是检查完整错误,因为这样更可靠。我只想知道这是否是我所期望的大致错误(而不是完全不相关的错误)。我很少检查完整的错误消息,而是使用关键字(例如“意外结束”、“不够”等)
这个函数是github.com/teamwork/test 包的一部分(我是那个包的主要作者),但如果我只使用这个函数而不使用那个包中的其他函数,我经常只是复制/粘贴它。