我正在为我的代码编写测试代码,并希望获得100%的代码覆盖率。
这意味着测试例如调用glog.Fatal()
的极端情况。
所以我首先需要的是禁用glog的任何输出,因为我没有测试glog。所以我可以运行go test而不在/tmp
生成文件或向stderr
生成spittig消息。
我需要的第二件事是调用glog.Fatal()
调用os.Exit()
不会干扰运行测试。
我怎么能实现这一目标?
答案 0 :(得分:0)
您应该可以通过编程到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
进行单元测试,无需实际调用记录器即可正确配置记录器。