为了账号安全,请及时绑定邮箱和手机立即绑定

尽管在 init() 中定义了标志,但 Go 测试中出现“提供标志但未定义”错误?

尽管在 init() 中定义了标志,但 Go 测试中出现“提供标志但未定义”错误?

Go
喵喔喔 2022-07-11 16:23:57
这个问题类似于go test flag: flag provided but not defined,但是由于该问题不包含最小示例并且答案非常高级,所以我再问一次。在带有 amain.go和 a的 Go 模块中main_test.go,.├── go.mod├── go.sum├── main.go└── main_test.gomain.go定义一个sayHi标志:package mainimport (    "flag"    "fmt")var sayHi boolfunc init() {    flag.BoolVar(&sayHi, "sayHi", false, "Say hi or not")    flag.Parse()}func main() {    if sayHi {        fmt.Println("Hi!")    }}这main_test.go只是一个占位符测试:package mainimport "testing"func TestSayHi(t *testing.T) {}问题是,如果我尝试运行测试,我会收到“已提供标志但未定义”错误:> go test ./...flag provided but not defined: -test.testlogfileUsage of /var/folders/tp/s7nwwdws1wj0z8s0vftppnnc0000gn/T/go-build952058535/b001/my-module.test:  -sayHi        Say hi or notFAIL    github.com/kurtpeek/my-module   0.192sFAIL从上述问题的答案来看,您必须确保所有标志定义都发生在调用之前flag.Parse(),通常是通过在init()函数中定义所有标志。我不明白这不是在这里完成的吗?
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

使用以下命令创建测试二进制文件,然后使用您的参数执行它。


> go test -c -o test

./test --sayHi=true

PASS

go test 命令不会将参数传递给底层测试。


查看完整回答
反对 回复 2022-07-11
?
开满天机

TA贡献1786条经验 获得超13个赞

2022 年 5 月更新 - 未修复

到目前为止,推荐的方法是将标志初始化移到外面init()(太愚蠢了,我知道!)

所以我这样做了:

  • 将用于标志处理的代码移动到它自己的函数中,

  • 然后在顶部调用该函数main()

我的测试不再抱怨。

func initParseCommandLineFlags() {

   // do your flag thing here

}


func main() {

    initParseCommandLineFlags()

    ...

}

注意:一个巨大的缺点是我必须将所有初始化移出init()其他设置功能,因为我的程序启动可以通过命令行开关进行修改。


所以我没有init了:(


参考:https ://github.com/golang/go/issues/46869#issuecomment-865695953


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号