たとえば、ログ メッセージを出力する次のコードがあるとします。正しいメッセージがログに記録されたかどうかをテストするにはどうすればよいでしょうか。 を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)
}
}
ベストアンサー1
これは「os.Exit()
Goでシナリオをテストする方法": 独自のロガーを実装する必要があります。これはデフォルトで にリダイレクトしますが、テスト時にのような関数を独自の関数 ( を呼び出さない)log.xxx()
に置き換える機会が与えられます。log.Fatalf()
os.Exit(1)
os.Exit()
通話テストでも同じことをしましたexit/exit.go
:
exiter = New(func(int) {})
exiter.Exit(3)
So(exiter.Status(), ShouldEqual, 3)
(ここでの「exit」関数は何もしない空の関数です)