這個問題類似于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()
(太愚蠢了,我知道?。?/p>
所以我這樣做了:
將用于標志處理的代碼移動到它自己的函數中,
然后在頂部調用該函數
main()
我的測試不再抱怨。
func initParseCommandLineFlags() {
// do your flag thing here
}
func main() {
initParseCommandLineFlags()
...
}
注意:一個巨大的缺點是我必須將所有初始化移出init()其他設置功能,因為我的程序啟動可以通過命令行開關進行修改。
所以我沒有init了:(
參考:https ://github.com/golang/go/issues/46869#issuecomment-865695953
- 2 回答
- 0 關注
- 113 瀏覽
添加回答
舉報
0/150
提交
取消