测试包含 log.Fatal() 的 Go 函数
考虑一个场景,其中您有一个使用 log.Fatal() 进行打印的 Go 函数消息。测试此类函数可能具有挑战性,因为 log.Fatal() 会触发 os.Exit(1),从而导致测试失败。
方法:
要克服这一挑战,需要建议实现一个自定义记录器,将输出重定向到其标准 log.xxx() 目的地。但是,在测试期间,您可以轻松地将 log.Fatalf() 等函数与您自己的不调用 os.Exit(1) 的实现进行交换。
示例:
假设我们有以下打印日志的代码:
package main import ( "log" ) func hello() { log.Print("Hello!") } func goodbye() { log.Fatal("Goodbye!") } func init() { log.SetFlags(0) } func main() { hello() goodbye() }
为了测试这段代码,我们可以制定假设测试:
package main import ( "bytes" "log" "testing" ) func TestHello(t *testing.T) { var buf bytes.Buffer log.SetOutput(&buf) hello() wantMsg := "Hello!\n" msg := buf.String() if msg != wantMsg { t.Errorf("%#v, wanted %#v", msg, wantMsg) } } func TestGoodby(t *testing.T) { var buf bytes.Buffer log.SetOutput(&buf) goodbye() wantMsg := "Goodbye!\n" msg := buf.String() if msg != wantMsg { t.Errorf("%#v, wanted %#v", msg, wantMsg) } }
注意:
此方法提供了在测试期间替换特定记录器函数的灵活性,允许在不影响原始函数功能的情况下进行行为定制正在测试。
以上是如何使用 log.Fatal() 有效测试 Go 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!