说,我有以下代码打印一些日志消息。我将如何测试已记录正确的消息?由于log.Fatal通话os.Exit(1)失败,测试失败。
log.Fatal
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) } }
这类似于“ 如何os.Exit()在Go中测试场景”:您需要实现自己的记录器,默认情况下,该记录器重定向到log.xxx(),但在测试时为您提供了将函数替换为log.Fatalf()您自己的记录器(不会调用os.Exit(1))的机会。
os.Exit()
log.xxx()
log.Fatalf()
我在测试os.Exit()电话中也做了同样的事情exit/exit.go:
exit/exit.go
exiter = New(func(int) {}) exiter.Exit(3) So(exiter.Status(), ShouldEqual, 3)
(在这里,我的“退出”功能是一个空的,什么也不做)