我有一个用Cobra编写的CLI应用程序。该应用程序包含一个根命令RootCmd
,其中包含两个PersistentFlags
。其中一个持久性标志名为threads
,默认值为1,缩写为-h
。
RootCmd.PersistentFlags().IntVarP(&threads, "threads", "t", 1, "Number of concurrent workers, using Stdin overrides this flag")
在PersistentPreRun
中,我检查该值是否设置为小于1,以打印错误消息threads can't be less than 1
并退出。
问题是我需要为应用程序编写一些测试,但我找不到设置标记的方法,目前我使用os/exec
进行测试,这非常烦人,而且不提供代码覆盖率。
我正在尝试做以下事情
func Test(t *testing.T) {
root := cmd.RootCmd
root.SetArgs([]string{"-t", "12"})
// or even: root.SetArgs([]string{"-t 12"})
root.Execute()
}
这将输出消息Error: unknown shorthand flag: 't' in -t 12
。完全忽略该标志并尝试使用任何子命令都会显示错误消息,即该值不能小于1(请注意,我设置了默认值)。
是否有除SetArgs
以外的方法设置标志或解决方法?
2条答案
按热度按时间nc1teljy1#
我不能重现这个问题。
我运行
cobra-cli init
创建了一个简单的Cobra应用程序,并添加了一个子命令foo
,得到了以下布局:main.go
为最小值:在
cmd/root.go
中,我添加了一个PersistentFlag
、--threads
(或-t
):在
cmd/foo.go
中,我定义了一个子命令:有了上面的代码,我可以运行:
我可以像这样为root命令编写一个测试:
这些测试按预期成功:
您可以在this repository中找到此答案中引用的所有文件。
fwzugrvs2#
我想我找到问题了,多亏了Iarsks提供的例子。
我以前的根
我将此函数分解为:
而现在它工作得很好。