示例.go:
package main
import(
"fmt"
"os"
)
type sample struct {
value int64
}
func (s sample) useful() {
if s.value == 0 {
fmt.Println("Error: something is wrong!")
os.Exit(1)
} else {
fmt.Println("May the force be with you!")
}
}
func main() {
s := sample{42}
s.useful()
s.value = 0
s.useful()
}
// output:
// May the force be with you!
// Error: something is wrong!
// exit status 1
我对如何在golang测试中使用接口做了很多研究。但到目前为止,我无法完全理解这一点。至少当我需要“模拟”(为使用这个词道歉)golang std 时,我看不到接口如何帮助我。库包,如“fmt”。
我想出了两个场景:
使用 os/exec测试命令行界面
包装 fmt包,所以我可以控制并能够检查输出字符串
我不喜欢这两种情况:
我经历了通过实际命令行的复杂和性能不佳(见下文)。也可能有便携性问题。
我相信这是要走的路,但我担心包装 fmt 包可能需要很多工作(至少包装时间包进行测试结果是一项非平凡的任务(https://github.com/finklabs/ttime ))。
这里的实际问题:还有另一种(更好/更简单/惯用)的方式吗? 注意:我想用纯golang做这个,我对下一个测试框架不感兴趣。
cli_test.go:
package main
import(
"os/exec"
"testing"
)
func TestCli(t *testing.T) {
out, err := exec.Command("go run sample.go").Output()
if err != nil {
t.Fatal(err)
}
if string(out) != "May the force be with you!\nError: this is broken and not useful!\nexit status 1" {
t.Fatal("There is something wrong with the CLI")
}
}
手掌心
白衣染霜花
相关分类