首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用go和ginkgo测试Stdout

使用go和ginkgo测试Stdout
EN

Stack Overflow用户
提问于 2014-09-02 00:17:32
回答 2查看 4.6K关注 0票数 6

在这里,我正在尝试在go命令行应用程序上执行BDD,这是我在go中迈出的第一步。我使用的是Ginkgo,它包装了testing.go,让你可以做更具表现力的BDD。https://github.com/onsi/ginkgo

我在读取stdout以对其进行断言时遇到了问题。

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

这就是我想要做的:

cli.go

代码语言:javascript
复制
 package cli
  
 import "fmt"
  
 func Run() {
        fmt.Println("Running cli")
 }

cli_test.go

代码语言:javascript
复制
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"))
        })
})
EN

回答 2

Stack Overflow用户

发布于 2014-09-03 22:25:27

测试Stdout可能很棘手。你有多项选择。

您可以在测试期间覆盖os.Stdout:(考虑检查错误)

代码语言:javascript
复制
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

代码语言:javascript
复制
package cli

import (
        "fmt"
        "io"
)

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

cli_test.go

代码语言:javascript
复制
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

代码语言:javascript
复制
package main

import (
        "cli"
        "os"
)

func main() {
        cli.Run(os.Stdout)
}
票数 8
EN

Stack Overflow用户

发布于 2014-09-04 12:07:15

这是一个典型的依赖注入用例。您可以使用来自Gomegagbytes.Buffer,并拥有类似于以下内容的单元测试:

代码语言:javascript
复制
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,在这种情况下,我建议您使用gexecgexec.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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25609734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档