1

zap.NewDevelopmentConfig()との構成に基づいて、zap.NewProductionConfig()zap がログを に書き込むと仮定しましたstderr。ただし、単体テストで出力をキャプチャできないようです。

私は次の機能を持っていますcaptureOutput

func captureOutput(f func()) string {
    r, w, err := os.Pipe()
    if err != nil {
        panic(err)
    }

    stdout := os.Stdout
    os.Stdout = w
    defer func() {
        os.Stdout = stdout
    }()

    stderr := os.Stderr
    os.Stderr = w
    defer func() {
        os.Stderr = stderr
    }()

    f()
    w.Close()

    var buf bytes.Buffer
    io.Copy(&buf, r)

    return buf.String()
}

zap の出力をキャプチャすることはできませんが、 からの出力を取得することはできますfmt.Println(...):

func TestZapCapture(t *testing.T) {
    auditor, _ := zap.NewProduction()
    output := captureOutput(func() {
        auditor.Info("hi")
    })

    assert.NotEmpty(t, output)
    //fails to captures output
}

func TestFmtCapture(t *testing.T) {
    output := captureOutput(func() {
        fmt.Println("hi")
    })

    assert.NotEmpty(t, output)
    //successfully captures output
}

このような状況で zap オブザーバーを使用することは承知していますが、私の実際の使用例は、高度に変更された zap ロガーをテストすることであり、新しいものをテストするzap.Coreと目的が無効になります。その出力をキャプチャする最良の方法は何ですか?

4

1 に答える 1