一尘不染

如何在单元测试中测试功能的输出(stdout / stderr)

go

我有一个简单的功能要测试:

func (t *Thing) print(min_verbosity int, message string) {
    if t.verbosity >= minv {
        fmt.Print(message)
    }
}

但是,如何测试该函数实际发送到标准输出的内容呢?Test :: Output在Perl中实现了我想要的功能

orig = os.Stdout
r,w,_ = os.Pipe()
thing.print("Some message")
var buf bytes.Buffer
io.Copy(&buf, r)
w.Close()
os.Stdout = orig
if(buf.String() != "Some message") {
    t.Error("Failure!")
}

但这对于每个测试来说都是很多额外的工作。我希望有一种更标准的方法,或者也许是一个抽象库来处理此问题。


阅读 326

收藏
2020-07-02

共1个答案

一尘不染

还需要记住的一件事是,没有什么可以阻止您编写避免编写样板代码的函数。

例如,我有一个使用的命令行应用程序,log我编写了以下函数:

func captureOutput(f func()) string {
    var buf bytes.Buffer
    log.SetOutput(&buf)
    f()
    log.SetOutput(os.Stderr)
    return buf.String()
}

然后像这样使用它:

output := captureOutput(func() {
    client.RemoveCertificate("www.example.com")
})
assert.Equal("removed certificate www.example.com\n", output)

使用此断言库:http :
//godoc.org/github.com/stretchr/testify/assert。

2020-07-02