gpt4 book ai didi

unit-testing - 如何在 Go 中对命令行标志进行单元测试?

转载 作者:IT老高 更新时间:2023-10-28 13:09:17 25 4
gpt4 key购买 nike

我想要一个单元测试来验证特定命令行标志是否在枚举中。

这是我要编写测试的代码:

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()
}

只有当 -format 等于上面给出的 const 值之一时,所需的测试才会通过。该值将在 formatType 中可用。一个正确的调用示例是:program -format text

测试所需行为的最佳方法是什么?

注意:也许我表达得不好,但显示的代码不是单元测试本身,而是我要编写单元测试的代码。这是我正在编写的工具中的一个简单示例,想问一下是否有一种好方法可以测试该工具的有效输入。

最佳答案

标志的自定义测试和处理可以通过flag.Var 来实现。 flag 中的函数包。

Flag.Var “用指定的名称和使用字符串定义一个标志。标志的类型和值由第一个参数表示,类型为 Value,通常包含用户定义的 Value 实现。 "

一个 flag.Value是任何满足Value接口(interface)的类型,定义为:

type Value interface {
String() string
Set(string) error
}

example_test.go 中有一个很好的例子flag package source 中的文件

对于您的用例,您可以使用以下内容:

package main

import (
"errors"
"flag"
"fmt"
)

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
}

var typeFlag formatType

func init() {
typeFlag = "text"
usage := `Format type. Must be "text", "json" or "hash". Defaults to "text".`
flag.Var(&typeFlag, "format", usage)
flag.Var(&typeFlag, "f", usage+" (shorthand)")
}

func main() {
flag.Parse()
fmt.Println("Format type is", typeFlag)
}

对于这样一个简单的示例来说,这可能有点过头了,但在定义更复杂的标志类型时可能非常有用(链接的示例将逗号分隔的间隔列表转换为基于 time.Duration 的自定义类型的 slice )。

编辑:在回答如何针对标志运行单元测试时,最典型的例子是 flag_test.go in the flag package source .与测试自定义标志变量相关的部分从 Line 181 开始。 .

关于unit-testing - 如何在 Go 中对命令行标志进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17412908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com