这个问题类似于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 命令不会将参数传递给底层测试。

开满天机
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
- 2 回答
- 0 关注
- 158 浏览
添加回答
举报
0/150
提交
取消