就其本身而言,这并不是Go的事情,它取决于您的偏好,但是:
一个。不要测试
main。main应该只调用已测试的代码,最好在其他软件包中。对这些软件包提供尽可能多的代码覆盖率,并尽可能使main保持琐碎。无论覆盖范围如何,这都是一个好习惯。因此,这并不是真正的问题。
b。不要
log.Fatal用于可测试的代码,只需返回错误。您可以保留
log.Fatal应用程序初始化代码,即
main-in
:)。因此,如果main调用
readConfig失败了,它只会返回一个错误(非常容易测试!)。应用程序的
log.Fatal主要行为是main的工作-
配置读取器不应处理诸如确定是否应退出应用程序之类的事情,对吗?它只是读取配置,并告诉您是否成功。应用程序决定如何处理它。
因此您的代码可能如下所示:
func readConfig(path string) (Config, error) { var cfg Config file, err := ioutil.ReadFile(path) if err != nil { return cfg, err } err = json.Unmarshal(file, &cfg) if err != nil { return cfg, err } return cfg, nil}func main() { config, err := readConfig("config.json") if err != nil { log.Fatal(err) }}现在,您已将逻辑与应用程序行为分开,并且
readConfig可以完全测试。



