如何在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本身有关。至于你的第二个问题,我发现这是一篇很好的文章,可以帮助你。我建议在标记问题上创建一个单独的问题,因为这个问题看起来像您的代码问题。