Fli*_*mzy 17 testing stdout 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!")
}
但是对于每一项测试来说,这都是额外的工作.我希望有更标准的方法,或者可能是一个抽象库来处理这个问题.
Cal*_*leb 26
还有一件事要记住,没有什么可以阻止你编写函数来避免样板.
例如,我有一个使用的命令行应用程序,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.
Ain*_*r-G 15
你可以做两件事之一.第一个是使用示例.
该包还运行并验证示例代码.示例函数可以包括以"Output:"开头的结束行注释,并在运行测试时与函数的标准输出进行比较.(比较忽略前导和尾随空格.)这些是示例的示例:
func ExampleHello() {
        fmt.Println("hello")
        // Output: hello
}
第二个(更合适的是,IMO)是为你的IO使用假函数.在你的代码中你做:
var myPrint = fmt.Print
func (t *Thing) print(min_verbosity int, message string) {
    if t.verbosity >= minv {
        myPrint(message) // N.B.
    }
}
在你的测试中:
func init() {
    myPrint = fakePrint // fakePrint records everything it's supposed to print.
}
func Test...
另一种选择是使用fmt.Fprintf与io.Writer是os.Stdout在生产代码,但也可以说,bytes.Buffer在测试中.