在我想要测试的包中,我有一个 init 函数,它加载配置文件,其中包含我想用来运行应用程序的一些内容。但是,我不想在运行单元测试时触发此初始化函数。
有没有办法在单元测试期间跳过或阻止调用此 init 函数?
一些片段来说明这个问题:
func init() {
var err error // Necessary to prevent config variable shadowing
config, err = loadConfig("./client/config.yml")
if err != nil {
log.Fatal(err)
}
}
func loadConfig(filepath string) (*Config, error) {
viper.SetConfigFile(filepath)
if err := viper.ReadInConfig(); err != nil {
return nil, fmt.Errorf("Error loading config file: %s", err)
}
(...)
}
// New returns a Config value(!)
func New() Config {
return *config
}
一个测试用例:
func TestNew(t *testing.T) {
expected := &Config{}
observed := New()
if !reflect.DeepEqual(observed, expected) {
t.Errorf("observed %+v. expecting %+v\n", observed, expected)
}
}
我不确定是否有更好的方法来做到这一点,但是如果您考虑到包级变量在init
func 运行后,您可以使用一个标志来告诉您是否正在运行测试。
var _testing = false
func init() {
if _testing {
return
}
var err error // Necessary to prevent config variable shadowing
config, err = loadConfig("./client/config.yml")
if err != nil {
log.Fatal(err)
}
}
// ...
在您的测试文件中,您可以执行以下操作:
// not nice but works
var _ = (func() interface{} {
_testing = true
return nil
}())
func TestNew(t *testing.T) {
expected := &Config{}
observed := New()
if !reflect.DeepEqual(observed, expected) {
t.Errorf("observed %+v. expecting %+v\n", observed, expected)
}
}
您可以在此处阅读有关初始化顺序的更多信息:https://golang.org/ref/spec#Program_initialization_and_execution https://golang.org/ref/spec#Program_initialization_and_execution
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)