用go和ginkgo测试Stdout

时间:2014-09-01 16:17:32

标签: go ginkgo

这里我正在尝试在go命令行应用程序上尝试BDD。 我正在使用Ginkgo,它包装了testing.go并让你做更具表现力的BDD。 https://github.com/onsi/ginkgo

我在阅读stdout时遇到问题要对它进行断言。

pkg/testing示例中发现在运行之前存根输出,但我找不到读取该输出的方法:http://golang.org/src/pkg/testing/example.go

这就是我想做的事情:

cli.go

 package cli

 import "fmt"

 func Run() {
        fmt.Println("Running cli")
 }

cli_test.go

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"))
        })
})

2 个答案:

答案 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"))
        })
})

或者您可以将作家传递给您的函数:

cli.go

package cli

import (
        "fmt"
        "io"
)

func Run(w io.Writer) {
        fmt.Fprintln(w, "Running cli")
}

cli_test.go

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"))
        })
})

main.go

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")

有关gbytesgexec的更多详情:

http://onsi.github.io/gomega/#gbytes-testing-streaming-buffers

http://onsi.github.io/gomega/#gexec-testing-external-processes