我正在尝试让这个测试套件通过命令提示符(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]
答案 0 :(得分:-1)
我已开发(用于此类单元测试)godbg.Out()
and godbg.Err()
,两个io.Writer
,默认情况下为os.Stdout
和os.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上完成的输出。
注意:
答案 1 :(得分:-2)
显然,要让原始测试套件通过,我必须做的就是将sayHello()
函数定义为字符串,并返回其值"Hello, World!
。另外,我发表了第3和第6行评论,因为它们不会直接影响代码:
package helloworld
//import "fmt"
func sayHello() string {
//fmt.Println("Hello, World!")
return "Hello, World!"
}
这些评论是否使代码的风格变得更加俗气"?