未能使测试套件通过golang“sayHello()用作值”

时间:2015-02-12 01:21:35

标签: go

我正在尝试让这个测试套件通过命令提示符(hello-world_test.go):

package helloworld

import "testing"

func TestHelloWorld(t *testing.T) {
    output := sayHello()
    if "Hello, World!" != output {
        t.Fatalf("output: %s\nexpected: Hello,World!", output)
    }
}

我的代码如下(helloworld.go):

package helloworld

import "fmt"

func sayHello() {
    fmt.Println("Hello, World!")

}

并通过命令提示符输入错误代码:

C:\Users\Troy\exercism\go\hello-world\go test -v
# _/C_/Users/Troy/exercism/go/hello-world
.\hello-world_test.go:6: sayHello() used as value
FAIL    _/C_/Users/Troy/exercism/go/hello-world [build failed]

2 个答案:

答案 0 :(得分:-1)

我已开发(用于此类单元测试)godbg.Out() and godbg.Err(),两个io.Writer,默认情况下为os.Stdoutos.Stderr

这意味着我不再使用fmt.Println("Hello, World!")

相反,我做了:

fmt.Fprintln(Out(), "Hello, World!")

这允许我,当我想对输出进行单元测试(并且没有单元测试自己的输出填充fmt.Println结果)时,更改默认io.Writer 使用pdbg.SetBuffer()函数,专门用于该测试。

那样,my test becomes

    Convey("Test custom buffer reset on global pdbg", func() {
        SetBuffers(nil)
        fmt.Fprint(Out(), "test content")
        So(OutString(), ShouldEqual, `test content`)
        fmt.Fprint(Err(), "err1 cerr")
        So(ErrString(), ShouldEqual, `err1 cerr`)
        ResetIOs()
        fmt.Fprint(Out(), "test2 content2")
        So(OutString(), ShouldEqual, `test2 content2`)
        fmt.Fprint(Err(), "err2 cerr2")
        So(ErrString(), ShouldEqual, `err2 cerr2`)
    })

我现在可以通过替换(仅在单元测试期间)使用我自己的编写器来测试在stdout或stderr上完成的输出。

注意:

  • 我在这里使用 goconvey 单元测试框架。
  • 设计仍在进行中。我稍后可能会将这些编写器函数移到自己的包中。

答案 1 :(得分:-2)

显然,要让原始测试套件通过,我必须做的就是将sayHello()函数定义为字符串,并返回其值"Hello, World!。另外,我发表了第3和第6行评论,因为它们不会直接影响代码:

package helloworld

//import "fmt" 

func sayHello() string {
    //fmt.Println("Hello, World!") 
    return "Hello, World!"
}

这些评论是否使代码的风格变得更加俗气"?