单元测试不同的标志值

Kur*_*aum 5 unit-testing go

我有以下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参数返回不同的值?

dmi*_*ris 0

如果像下面的代码那样更改它,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 是一个字符串)