尝试奔跑 https://github.com/adonovan/gopl.io/blob/master/ch8/cake/cake_test.go
但是得到了
panic: testing: Verbose called before Init
goroutine 1 [running]:
testing.Verbose(...)
/usr/lib/go-1.17/src/testing/testing.go:453
.../cake_test.init()
它说错误来自
cake_test.init()
,但cake_test.go
文件不包含init()
:
$ grep init cake_test.go | wc
0 0 0
到底是什么问题?
对于这种特定情况,添加 Init() 函数就可以解决问题。
var defaults cake.Shop
func Init() {
defaults = cake.Shop{
Verbose: testing.Verbose(),
Cakes: 20,
BakeTime: 10 * time.Millisecond,
NumIcers: 1,
IceTime: 10 * time.Millisecond,
InscribeTime: 10 * time.Millisecond,
}
}
发生这种情况是因为测试包本身有一个 init 来处理测试标志,并且您正在调用 Verbose 来创建全局变量
https://cs.opensource.google/go/go/+/refs/tags/go1.18:src/testing/testing.go;l=548
为了避免这种情况,您可以:
func() bool
),但我认为这很复杂另外,考虑创建一个具有与 Println 相同签名的方法
Debug
,如果 Verbose 为 true 则调用 fmt.Println
如果你有一个构造函数,你可以创建第二个字段:Logger,它是一个与 Println 具有相同签名的函数,你可以使用 fmt.Println 进行初始化,在测试中你可以设置为 t.Log 以获得更好的体验
当然,也许有些建议比其他建议更先进,请随意尝试一下并选择最好的建议