首页  >  文章  >  后端开发  >  如何在 Go 中对命令行标志枚举验证进行单元测试?

如何在 Go 中对命令行标志枚举验证进行单元测试?

Barbara Streisand
Barbara Streisand原创
2024-11-17 10:57:02890浏览

How to Unit Test Command Line Flag Enumeration Validation in Go?

Go 中的单元测试命令行标志

在 Go 中,为命令行应用程序定义自定义标志需要彻底的测试过程以确保其正确性。一种特定场景涉及验证特定标志的值是否落在预定义的枚举范围内。

要测试的代码

<code class="go">var formatType string

const (
    text = "text"
    json = "json"
    hash = "hash"
)

func init() {
    const (
        defaultFormat = "text"
        formatUsage   = "desired output format"
    )

    flag.StringVar(&formatType, "format", defaultFormat, formatUsage)
    flag.StringVar(&formatType, "f", defaultFormat, formatUsage+" (shorthand)")
}

func main() {
    flag.Parse()
}</code>

测试方法

为了对所需的行为进行单元测试,我们可以利用 flag.Var 函数的强大功能,它允许我们为标志定义自定义类型和验证规则。

<code class="go">type formatType string

func (f *formatType) String() string {
    return fmt.Sprint(*f)
}

func (f *formatType) Set(value string) error {
    if len(*f) > 0 && *f != "text" {
        return errors.New("format flag already set")
    }
    if value != "text" && value != "json" && value != "hash" {
        return errors.New("Invalid Format Type")
    }
    *f = formatType(value)
    return nil
}</code>

在此自定义类型实现中:

  • String() 以字符串形式返回标志的当前值。
  • Set() 更新标志的值并确保其落在允许的枚举范围内。

通过使用此自定义 formatType 标志,测试过程现在可以验证设置为各种值时标志的行为。

示例测试

<code class="go">package main

import "testing"

func TestFormatType(t *testing.T) {
    tests := []struct {
        args   []string
        expect string
    }{
        {[]string{"-format", "text"}, "text"},
        {[]string{"-f", "json"}, "json"},
        {[]string{"-format", "foo"}, "Invalid Format Type"},
    }

    for _, test := range tests {
        t.Run(test.args[0], func(t *testing.T) {
            flag.Parse()
            if typeFlag != test.expect {
                t.Errorf("Expected %s got %s", test.expect, typeFlag)
            }
        })
    }
}</code>

在此示例中:

  • TestFormatType 迭代测试列表。
  • 每个测试都会设置命令行参数,解析标志,并将生成的 typeFlag 值与预期进行比较结果。
  • 如果任何测试失败,则会报告错误。

以上是如何在 Go 中对命令行标志枚举验证进行单元测试?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn