3 回答
TA贡献1851条经验 获得超4个赞
虽然可以测试包含 log.Fatal 的代码,但不建议这样做。特别是,您不能以 上的-cover
标志支持的方式测试该代码go test
。
相反,建议您更改代码以返回错误而不是调用 log.Fatal。在顺序函数中,您可以添加额外的返回值,而在 goroutine 中,您可以在类型为通道chan error
(或某些包含错误类型字段的结构类型)上传递错误。
一旦进行了更改,您的代码将更易于阅读,更易于测试,并且更易于移植(现在除了命令行工具之外,您还可以在服务器程序中使用它)。
如果您有log.Println
电话,我还建议将自定义记录器作为接收器上的字段传递。这样您就可以登录到自定义记录器,您可以将其设置为服务器的 stderr 或 stdout,以及用于测试的 noop 记录器(这样您就不会在测试中获得一堆不必要的输出)。该log
包支持自定义记录器,因此无需为此编写自己的或导入第三方包。
TA贡献1829条经验 获得超6个赞
我使用以下代码来测试我的功能。在 xxx.go 中:
var logFatalf = log.Fatalf
if err != nil {
logFatalf("failed to init launcher, err:%v", err)
}
在 xxx_test.go 中:
// TestFatal is used to do tests which are supposed to be fatal
func TestFatal(t *testing.T) {
origLogFatalf := logFatalf
// After this test, replace the original fatal function
defer func() { logFatalf = origLogFatalf } ()
errors := []string{}
logFatalf = func(format string, args ...interface{}) {
if len(args) > 0 {
errors = append(errors, fmt.Sprintf(format, args))
} else {
errors = append(errors, format)
}
}
if len(errors) != 1 {
t.Errorf("excepted one error, actual %v", len(errors))
}
}
- 3 回答
- 0 关注
- 171 浏览
添加回答
举报