我有以下Golang代码:
func getConfigFile() string {
var configFile string
flag.StringVar(&configFile, "config", "", "File containing configuration")
flag.Parse()
return configFile
}
Run Code Online (Sandbox Code Playgroud)
该函数在我的代码的其他地方使用,并且我想对用户为config参数提供不同值(在其他位置使用config文件名)进行单元测试。
有没有办法告诉标志包在测试期间为config参数返回不同的值?
如果像下面的代码那样更改它,go test将会失败,但go test -config testconfig会通过。并不是说我们不需要调用flag.Parse(),init()因为它是由测试包调用的(正如 Rob Pike 在https://groups.google.com/d/msg/golang-nuts/uSFM8jG7yn4/PIQfEWOZx4EJ中提到的那样)。
package main
import (
"flag"
"testing"
)
var configFile = flag.String("config", "", "File containing configuration")
func getConfigFile() string {
return *configFile
}
func TestConfig(t *testing.T) {
want := "testconfig"
if s := getConfigFile(); s != want {
t.Errorf("Got %s, want %s", s, want)
}
}
Run Code Online (Sandbox Code Playgroud)
测试运行:
$ go test
--- FAIL: TestConfig (0.00s)
flag_test.go:17: Got , want testconfig
FAIL
exit status 1
FAIL github.com/dmitris/soflagtest 0.013s
$ go test -config testconfig
PASS
ok github.com/dmitris/soflagtest 0.012s
Run Code Online (Sandbox Code Playgroud)
您还可以使用
var configFile string声明和init()函数将标志值分配给变量:
func init() {
flag.StringVar(&configFile, "config", "", "File containing configuration")
}
Run Code Online (Sandbox Code Playgroud)
(然后在 getConfigFile 中没有指针取消引用,因为 configFile 是一个字符串)