0

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

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

所以我需要做的第一件事是禁用 glog 的任何输出,因为我没有测试 glog。所以我可以运行 go test 而不/tmpstderr.

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

我怎么能做到这一点?

4

1 回答 1

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正确地对记录器的配置进行单元测试,而无需实际调用记录器。

于 2016-11-26T16:20:37.673 回答