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>
在此自定义类型实现中:
通过使用此自定义 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>
在此示例中:
以上是如何在 Go 中对命令行标志枚举验证进行单元测试?的详细内容。更多信息请关注PHP中文网其他相关文章!