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

Kur*_*eek 8 go

这个问题类似于go test flag: flagprovidedbutnotdefine,但是由于该问题不包含最小的示例并且答案非常高级,所以我再次询问它。main.go在带有 a和 a 的Go 模块中main_test.go

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.mod\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.sum\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.go\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main_test.go\n
Run Code Online (Sandbox Code Playgroud)\n

定义main.go了一个sayHi标志:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.mod\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.sum\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.go\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main_test.go\n
Run Code Online (Sandbox Code Playgroud)\n

main_test.go只是一个占位符测试:

\n
package main\n\nimport (\n    "flag"\n    "fmt"\n)\n\nvar sayHi bool\n\nfunc init() {\n    flag.BoolVar(&sayHi, "sayHi", false, "Say hi or not")\n    flag.Parse()\n}\n\nfunc main() {\n    if sayHi {\n        fmt.Println("Hi!")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

问题是,如果我尝试运行测试,我会收到“提供标志但未定义”错误:

\n
> go test ./...\nflag provided but not defined: -test.testlogfile\nUsage of /var/folders/tp/s7nwwdws1wj0z8s0vftppnnc0000gn/T/go-build952058535/b001/my-module.test:\n  -sayHi\n        Say hi or not\nFAIL    github.com/kurtpeek/my-module   0.192s\nFAIL\n
Run Code Online (Sandbox Code Playgroud)\n

从上述问题的回答来看,

\n
\n

您必须确保所有标志定义在调用之前发生flag.Parse(),通常是通过在函数内定义所有标志来实现init()

\n
\n

我不明白这里怎么没有这样做?

\n

小智 0

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

> go test -c -o test
./test --sayHi=true
PASS
Run Code Online (Sandbox Code Playgroud)

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