Cobra:如何在测试中以编程方式设置标志
Cobra: how to set flags programmatically in tests
我正在使用 cobra
构建 CLI,并希望模拟一个命令 运行 与不同的 options/flags 集合。我一直在努力弄清楚如何使用 cobra API 在我的测试中设置标志,但还没有真正弄明白。
我有这个:
// NewFooCmd returns a cobra.Command fitted to print output to the buffer for easier testing.
buf := &bytes.Buffer{}
cmd := package.NewFooCmd(buf)
cmd.Execute()
// some validations on the content of buf
到目前为止我发现的最接近的是:
cmd.Flags().Set(name string, value string)
...但这似乎不对,因为虽然标志的名称都是字符串,但它们并不都将字符串作为值。即使我有一个 int
标志并传递 string(1)
.
它似乎也不起作用
这里有什么我遗漏的简单的东西吗?
您可以为此使用 (c *Command) SetArgs(a []string)
function。您的某些参数是整数或布尔值这一事实在这里无关紧要 - 毕竟,这就是用户将在命令行上输入的内容!
开发测试时可以使用 (c *Command) DebugFlags()
function 以确保您传递的标志也被正确插入。
我与 Cobra 的集成测试最终看起来像这样:
...
cmd := cli.RootCmd()
buf := new(bytes.Buffer)
cmd.SetOutput(buf)
cmd.SetArgs([]string{
"--some-flag",
fmt.Sprintf("--some-string=%s", value),
fmt.Sprintf("--some-integer=%d", integer),
})
err := cmd.Execute()
...
我正在使用 cobra
构建 CLI,并希望模拟一个命令 运行 与不同的 options/flags 集合。我一直在努力弄清楚如何使用 cobra API 在我的测试中设置标志,但还没有真正弄明白。
我有这个:
// NewFooCmd returns a cobra.Command fitted to print output to the buffer for easier testing.
buf := &bytes.Buffer{}
cmd := package.NewFooCmd(buf)
cmd.Execute()
// some validations on the content of buf
到目前为止我发现的最接近的是:
cmd.Flags().Set(name string, value string)
...但这似乎不对,因为虽然标志的名称都是字符串,但它们并不都将字符串作为值。即使我有一个 int
标志并传递 string(1)
.
这里有什么我遗漏的简单的东西吗?
您可以为此使用 (c *Command) SetArgs(a []string)
function。您的某些参数是整数或布尔值这一事实在这里无关紧要 - 毕竟,这就是用户将在命令行上输入的内容!
开发测试时可以使用 (c *Command) DebugFlags()
function 以确保您传递的标志也被正确插入。
我与 Cobra 的集成测试最终看起来像这样:
...
cmd := cli.RootCmd()
buf := new(bytes.Buffer)
cmd.SetOutput(buf)
cmd.SetArgs([]string{
"--some-flag",
fmt.Sprintf("--some-string=%s", value),
fmt.Sprintf("--some-integer=%d", integer),
})
err := cmd.Execute()
...