我正在为我的代码编写测试代码,并希望获得 100% 的代码覆盖率。
这意味着测试例如调用glog.Fatal()
的极端情况。
所以我需要做的第一件事是禁用 glog 的任何输出,因为我没有测试 glog。所以我可以运行 go test 而不/tmp
在stderr
.
我需要的第二件事是glog.Fatal()
调用os.Exit()
不会干扰运行测试的调用。
我怎么能做到这一点?
您应该能够通过对glog
接口进行编程来实现它。我不确定那是什么,但它可能看起来像
type Logger interface {
Fatal()
Info()
// etc...
}
然后你的包/函数/结构等,将不得不要求接口反对包括一个全局。
type SomeStruct struct {
log Logger
}
或者在您的顶级模块上:
func SomeFunc(log Logger) {}
使用接口可以将您的代码与特定于记录器的实现分离。
在您的单元测试中,您可以创建一个特定于测试的记录器,它是一个存根或模拟。
type TestLogger struct {}
func (tl TestLogger) Fatal() {}
func (tl TestLogger) Info() {}
// etc....
然后,您的代码必须能够Glog
在您的生产代码中实例化和配置真实实例。为了测试这一点,它应该像封装“创建”一个 Glog 实例一样简单。
func NewLogger Logger {
// configure `Glog`
// return `Glog`
}
这样,您应该能够NewLogger
正确地对记录器的配置进行单元测试,而无需实际调用记录器。