我有一个简单的功能要测试:
func (t *Thing) print(min_verbosity int, message string) {
if t.verbosity >= minv {
fmt.Print(message)
}
}
但是,如何测试该函数实际发送到标准输出的内容呢? Test::Output可以在Perl中实现我想要的功能。我知道我可以编写自己的所有样板文件以在Go中执行相同的操作(如here所述):
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!")
}
但这对于每个测试来说都是很多额外的工作。我希望有一种更标准的方法,或者也许是一个抽象库来处理此问题。
最佳答案
还需要记住的一件事是,没有什么可以阻止您编写函数来避免样板。
例如,我有一个使用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(t, "removed certificate www.example.com\n", output)
使用此断言库:http://godoc.org/github.com/stretchr/testify/assert。关于testing - 如何在单元测试中测试功能的输出(stdout/stderr),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26804642/