如何完全关闭glog以运行测试?

时间:2016-11-26 15:21:02

标签: go glog

我正在为我的代码编写测试代码,并希望获得100%的代码覆盖率。

这意味着测试例如调用glog.Fatal()的极端情况。

所以我首先需要的是禁用glog的任何输出,因为我没有测试glog。所以我可以运行go test而不在/tmp生成文件或向stderr生成spittig消息。

我需要的第二件事是调用glog.Fatal()调用os.Exit()不会干扰运行测试。

我怎么能实现这一目标?

1 个答案:

答案 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进行单元测试,无需实际调用记录器即可正确配置记录器。