用go和银杏检测Stdout
在这里,我在go中迈出了第一步,尝试在go命令行应用程序上执行BDD。 我用的是银杏,它包装了testing.go,让你可以做更多有表现力的BDD 我在阅读标准时遇到问题,无法对其进行断言 发现在用go和银杏检测Stdout,go,ginkgo,Go,Ginkgo,在这里,我在go中迈出了第一步,尝试在go命令行应用程序上执行BDD。 我用的是银杏,它包装了testing.go,让你可以做更多有表现力的BDD 我在阅读标准时遇到问题,无法对其进行断言 发现在pkg/testing示例中,在运行之前不存根输出,但我找不到读取该输出的方法: 这就是我想做的: cli.go cli_test.go 测试Stdout可能很棘手。你有多项选择 您可以在测试期间覆盖os.Stdout:(考虑检查错误) 或者,您可以将编写器传递给您的函数: cli.go cli_tes
pkg/testing
示例中,在运行之前不存根输出,但我找不到读取该输出的方法:
这就是我想做的:
cli.go
cli_test.go
测试Stdout可能很棘手。你有多项选择 您可以在测试期间覆盖os.Stdout:(考虑检查错误) 或者,您可以将编写器传递给您的函数: cli.go cli_test.go 梅因,加油
这是依赖注入的经典用例。您可以使用
Gomega
中的gbytes.Buffer
,并为单元测试提供类似的功能:
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
可用,再次,写:
预期(会话).To(GB.Say)(“正在运行cli\n”)
有关gbytes
和gexec
的更多详细信息,请参见:
我不熟悉银杏,在第二种情况下,如果你通过一个writer,@Onsi解决方案可能会更好。甚至可以将
gbytes
包装到*os.File中以覆盖os.Stdout。gexec.Start通常在什么时候调用?例如,我希望有多个Ifs测试二进制文件的一次运行。
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"))
})
})
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)
}
var _ = Describe("Cli", func() {
It("should parse update stemcell flag", func() {
buffer := gbytes.NewBuffer()
Run(buffer)
Expect(buffer).To(gbytes.Say("Running cli\n"))
})
})