小编典典

如何测试包含log.Fatal()的Go函数

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)
    }
}

阅读 623

收藏
2020-07-02

共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)

(在这里,我的“退出”功能是一个空的,什么也不做)

2020-07-02