Cobra:如何在测试中以编程方式设置标志

时间:2018-04-16 02:35:13

标签: testing go cl go-cobra cobra

我正在使用cobra来构建CLI,并希望模拟使用不同选项/标志集运行的命令。我一直试图弄清楚如何使用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),它似乎也不起作用。

这里有什么简单的东西吗?

1 个答案:

答案 0 :(得分:4)

您可以使用(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()

...