【发布时间】:2017-09-10 14:49:55
【问题描述】:
在我要测试的包中,我有一个 init 函数,它加载包含一些我想用来运行我的应用程序的东西的配置文件。但是,我不想在运行单元测试时触发这个初始化函数。
有什么方法可以跳过或阻止在单元测试期间调用这个 init 函数?
一些sn-ps来说明问题:
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() 函数中加载您的配置,原因是(测试问题)以及其他(结构、可重用性、控制等)。只需从您的入口点调用 loadConfig()。
标签: unit-testing go