猿问

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

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


.

├── go.mod

├── go.sum

├── main.go

└── main_test.go

main.go定义一个sayHi标志:


package main


import (

    "flag"

    "fmt"

)


var sayHi bool


func init() {

    flag.BoolVar(&sayHi, "sayHi", false, "Say hi or not")

    flag.Parse()

}


func main() {

    if sayHi {

        fmt.Println("Hi!")

    }

}

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


package main


import "testing"


func TestSayHi(t *testing.T) {


}

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


> go test ./...

flag provided but not defined: -test.testlogfile

Usage of /var/folders/tp/s7nwwdws1wj0z8s0vftppnnc0000gn/T/go-build952058535/b001/my-module.test:

  -sayHi

        Say hi or not

FAIL    github.com/kurtpeek/my-module   0.192s

FAIL

从上述问题的答案来看,


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


我不明白这不是在这里完成的吗?


喵喔喔
浏览 159回答 2
2回答

MM们

使用以下命令创建测试二进制文件,然后使用您的参数执行它。> go test -c -o test./test --sayHi=truePASSgo test 命令不会将参数传递给底层测试。

开满天机

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
随时随地看视频慕课网APP

相关分类

Go
我要回答