log.Fatal() を含む Go 関数をテストする方法 質問する

log.Fatal() を含む Go 関数をテストする方法 質問する

たとえば、ログ メッセージを出力する次のコードがあるとします。正しいメッセージがログに記録されたかどうかをテストするにはどうすればよいでしょうか。 を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」関数は何もしない空の関数です)

おすすめ記事