单元测试 – 单元测试不同的标志值

我有以下Golang代码:

func getConfigFile() string {
    var configFile string
    flag.StringVar(&configFile, "config", "", "File containing configuration")
    flag.Parse()
    return configFile
}

这个函数在我的代码中的其他地方使用,我想单独测试当用户为config参数提供不同值时发生的事情(配置文件名在其他地方使用).
有没有办法告诉标志包在测试时为config参数返回不同的值?

最佳答案 我发现,为了测试自定义标志最好创建一个自定义标志集,这样我就可以完全测试标志,包括-h选项而不退出测试.希望附加的代码能够让您了解如何在代码上实现测试:

package main

import (
    "flag"
    "fmt"
    "os"
    "reflect"
    "testing"
)

// Test Helper
func expect(t *testing.T, a interface{}, b interface{}) {
    if a != b {
        t.Errorf("Expected: %v (type %v)  Got: %v (type %v)", a, reflect.TypeOf(a), b, reflect.TypeOf(b))
    }
}

type Flags struct {
    ConfigFile string
}

func (self *Flags) Parse(fs *flag.FlagSet) (*Flags, error) {
    fs.StringVar(&self.ConfigFile, "config", "", "File containing configuration")

    err := fs.Parse(os.Args[1:])
    if err != nil {
        return nil, err
    }

    return self, nil
}

func main() {

    fs := flag.NewFlagSet("test", flag.ContinueOnError)

    parser := Flags{}
    flags, err := parser.Parse(fs)
    if err != nil {
        panic(err)
    }
    fmt.Println(flags)

}

func TestFlags(t *testing.T) {
    oldArgs := os.Args
    defer func() { os.Args = oldArgs }()
    var flagTest = []struct {
        flag     []string
        name     string
        expected interface{}
    }{
        {[]string{"cmd", "-config", "config.yaml"}, "ConfigFile", "config.yaml"},
        {[]string{"cmd", "-config", "config.json"}, "ConfigFile", "config.json"},
        {[]string{"cmd", "-v"}, "Version", true},
    }

    for _, f := range flagTest {
        os.Args = f.flag
        p := &Flags{}
        fs := flag.NewFlagSet("test", flag.ContinueOnError)

        flags, err := p.Parse(fs)
        if err != nil {
            t.Error(err)
        }

        refValue := reflect.ValueOf(flags).Elem().FieldByName(f.name)
        switch refValue.Kind() {
        case reflect.Bool:
            expect(t, f.expected, refValue.Bool())
        case reflect.String:
            expect(t, f.expected, refValue.String())
        }
    }

}

我也把它放在这里:https://play.golang.org/p/h1nok1UMLA希望它可以给你一个想法.

点赞