func init() {
cobra.OnInitialize(initConfig)
rootCmd.PersistentFlags().StringVarP(&loglevel, "loglevel", "l", "info", "Default log level")
subCmd.Flags().StringVarP(&email, "email", "e", "", "the email")
err := viper.BindPFlags(rootCmd.PersistentFlags())
if err != nil {
log.Warnf("binding main flag set failed : %v,", err)
}
err := viper.BindPFlags(subCmd.Flags())
if err != nil {
log.Warnf("binding main flag set failed : %v,", err)
}
rootCmd.AddCommand(subCmd)
}
, но при выполнении тестов с этим:
>$ go test -v -count 1 ./cli/cmd -run TestSub --loglevel debug
flag provided but not defined: -loglevel
Я нашел это: https://github.com/spf13/viper/issues/375
Возможно, этот код не работает из-за этого проблема, и я должен связать каждый флаг вручную, а не через установленный флаг?
Эта init
функция определена в root.go
, который находится в том же пакете, что и sub_test.go
, который имеет func TestSub(t *testing.T)
РЕДАКТИРОВАТЬ: я пытался с одним вызовом привязки, но также происходит сбой: вместо вызова BindPFLags()
я использовал: viper.BindPFlag("loglevel", rootCmd.PersistentFlags().Lookup("loglevel")
, и я все еще получаю «флаг предоставлен, но не определен» Должно быть что-то глупое, я не вижу
EDIT2 Это работает:
var testLoglevel = flag.String("loglevel", "debug", "verbosity of logs")
func init() {
testing.Init()
flag.Parse()
}
Я добавил это внутри моего sub_test.go
.
Я все еще не понимаю, зачем это нужно, так как функция пакета init()
(внутри root.go
) также работает, и мы находимся в одном пакете, и я предполагаю, что viper
flag.Parse()
выполняет вызов BindPFlags()
или что-то еще.