如何在golang中为测试配置设置cobra和viper
我们正在启动一个二进制文件,它有几个子命令,都是用如何在golang中为测试配置设置cobra和viper,go,testing,go-cobra,viper-go,Go,Testing,Go Cobra,Viper Go,我们正在启动一个二进制文件,它有几个子命令,都是用cobra设置的。我们希望使用viper进行配置。因此,此项的初始化是根据文档设置的: func init() { cobra.OnInitialize(initConfig) RootCmd.PersistentFlags().StringVarP(&loglevel, "loglevel", "l", "info", "Default log level") //other persistent fl
cobra
设置的。我们希望使用viper
进行配置。因此,此项的初始化是根据文档设置的:
func init() {
cobra.OnInitialize(initConfig)
RootCmd.PersistentFlags().StringVarP(&loglevel, "loglevel", "l", "info", "Default log level")
//other persistent flags
viper.BindPFlags(RootCmd.PersistentFlags())
log.CreateLogger(loglevel)
//add all other subcommands
RootCmd.AddCommand(...)
}
我的问题是initConfig
:
func initConfig() {
if cfgFile != "" {
// Use config file from the flag.
viper.SetConfigFile(cfgFile)
} else {
// Find home directory.
home, err := homedir.Dir()
if err != nil {
handleError(err)
os.Exit(1)
}
confDir = filepath.Join(home, DefaultConfigDir)
viper.Set("configDir", configDir)
viper.SetConfigName("config")
viper.SetConfigType("json")
viper.AddConfigPath(configDir)
viper.AddConfigPath(".")
cfgFile = filepath.Join(configDir, "config.json")
}
viper.AutomaticEnv()
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// Config file not found; ignore error if desired l
err := os.Mkdir(cfgDir, os.ModePerm)
if err != nil {
handleError(err)
}
err = viper.WriteConfigAs(cfgFile)
if err != nil {
handleError(err)
}
} else {
handleError(err)
os.Exit(1)
}
}
}
这在init
内部运行,这在我的子命令包中—因此我的子命令测试也将运行此init
问题是它会查找home
文件夹,当然可能会弄乱现有的配置。换句话说,我不希望这个用于测试,我想要一个干净的测试目录
我怎样才能做到这一点?由于标志和配置的早期初始化,它必须在
init
内部运行,因此我无法找到替代方法。您真正了解执行顺序了吗?从cobra.OnInitialize的文档中,OnInitialize设置调用每个命令的Execute方法时要运行的传递函数。这意味着在执行命令后调用initConfig。一个选项是手动将值设置为cfgFile并将其指向有效的cfgFile。这将跳过主目录查找。看起来我可能确实搞错了。在这种情况下,我必须重新考虑初始化顺序。谢谢@praveentWhat更麻烦的是,但我想这应该是一个单独的问题,这段代码,无法将标志传递给测试:$go test-v-count 1./cli/cmd-run TestRun-loglevel debug标志已提供但未定义:-loglevel
我不知道我在那里做错了什么。为什么不删除这个问题,因为它更多地是与代码有关,而不是与cobra本身有关。至于你的第二个问题,我发现这是一篇很好的文章,可以帮助你。我建议在标记问题上创建一个单独的问题,因为这个问题看起来像是您的代码问题。您是否真正了解了执行顺序?从cobra.OnInitialize的文档中,OnInitialize设置调用每个命令的Execute方法时要运行的传递函数。这意味着在执行命令后调用initConfig。一个选项是手动将值设置为cfgFile并将其指向有效的cfgFile。这将跳过主目录查找。看起来我可能确实搞错了。在这种情况下,我必须重新考虑初始化顺序。谢谢@praveentWhat更麻烦的是,但我想这应该是一个单独的问题,这段代码,无法将标志传递给测试:$go test-v-count 1./cli/cmd-run TestRun-loglevel debug标志已提供但未定义:-loglevel
我不知道我在那里做错了什么。为什么不删除这个问题,因为它更多地是与代码有关,而不是与cobra本身有关。至于你的第二个问题,我发现这是一篇很好的文章,可以帮助你。我建议在标记问题上创建一个单独的问题,因为这个问题看起来像您的代码问题。