尽管在 init

分享于2022年07月17日 go 问答
【问题标题】:尽管在 init() 中定义了标志,但 Go 测试中出现“提供标志但未定义”错误?("flag provided but not defined" error in Go test despite the flag being defined in init()?)
【发布时间】:2022-05-01 09:54:00
【问题描述】:

这个问题与 go test flag: flag provided but not defined 类似,但由于该问题不包含最小示例且答案相当高级,所以我再问一次。在带有 main.go main_test.go 的 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() 函数中定义所有标志。

我不明白这里没有这样做吗?

  • 你为什么解析 init() 而不是 main()

【解决方案1】:

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

> go test -c -o test
./test --sayHi=true
PASS

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