如何测试包含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)

}

}

回答:

这类似于“ 如何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)

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

以上是 如何测试包含log.Fatal()的Go函数 的全部内容, 来源链接: utcz.com/qa/417443.html

回到顶部