我有一个简单的功能要测试:
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!") }
但这对于每个测试来说都是很多额外的工作。我希望有一种更标准的方法,或者也许是一个抽象库来处理此问题。
还需要记住的一件事是,没有什么可以阻止您编写避免编写样板代码的函数。
例如,我有一个使用的命令行应用程序,log我编写了以下函数:
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。