这里我正在尝试在go命令行应用程序上尝试BDD。 我正在使用Ginkgo,它包装了testing.go并让你做更具表现力的BDD。 https://github.com/onsi/ginkgo
我在阅读stdout时遇到问题要对它进行断言。
在pkg/testing
示例中发现在运行之前存根输出,但我找不到读取该输出的方法:http://golang.org/src/pkg/testing/example.go
这就是我想做的事情:
package cli
import "fmt"
func Run() {
fmt.Println("Running cli")
}
package cli_test
import (
. "github.com/altoros/bosh_deployer_cli/lib/cli"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Cli", func() {
It("should parse update stemcell flag", func() {
Run()
Expect(stdout).To(Equal("running cli"))
})
})
答案 0 :(得分:6)
测试Stdout可能很棘手。你有多种选择。
您可以在测试期间覆盖os.Stdout :(想想检查错误)
var _ = Describe("Cli", func() {
It("should parse update stemcell flag", func() {
r, w, _ := os.Pipe()
tmp := os.Stdout
defer func() {
os.Stdout = tmp
}()
os.Stdout = w
go func() {
Run()
w.Close()
}()
stdout, _ := ioutil.ReadAll(r)
Expect(string(stdout)).To(Equal("Running cli\n"))
})
})
或者您可以将作家传递给您的函数:
package cli
import (
"fmt"
"io"
)
func Run(w io.Writer) {
fmt.Fprintln(w, "Running cli")
}
package cli_test
import (
. "cli"
"io"
"io/ioutil"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Cli", func() {
It("should parse update stemcell flag", func() {
r, w := io.Pipe()
go func() {
Run(w)
w.Close()
}()
stdout, _ := ioutil.ReadAll(r)
Expect(string(stdout)).To(Equal("Running cli\n"))
})
})
package main
import (
"cli"
"os"
)
func main() {
cli.Run(os.Stdout)
}
答案 1 :(得分:4)
这是依赖注入的经典用例。您可以使用gbytes.Buffer
中的Gomega
进行单元测试:
var _ = Describe("Cli", func() {
It("should parse update stemcell flag", func() {
buffer := gbytes.NewBuffer()
Run(buffer)
Expect(buffer).To(gbytes.Say("Running cli\n"))
})
})
除非您对cli
进行集成测试,否则我建议使用gexec
gexec.Build
二进制文件,然后运行gexec.Start
命令,生成的gexec.Session
对象将捕获stdout
并将其作为gbytes.Buffer
提供,允许您再次写入:
Expect(session).To(gbytes.Say("Running cli\n")
有关gbytes
和gexec
的更多详情:
http://onsi.github.io/gomega/#gbytes-testing-streaming-buffers
http://onsi.github.io/gomega/#gexec-testing-external-processes