用go和银杏检测Stdout

用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

在这里,我在go中迈出了第一步,尝试在go命令行应用程序上执行BDD。 我用的是银杏,它包装了testing.go,让你可以做更多有表现力的BDD

我在阅读标准时遇到问题,无法对其进行断言

发现在
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"))
        })
})