猿问

Cobra + Viper Golang 如何测试子命令?

我正在用 Go 开发一个网络应用程序。到目前为止一切顺利,但现在我将 Wercker 集成为 CI 工具并开始关心测试。但是我的应用程序严重依赖 Cobra/Viper 配置/标志/environment_variables 方案,我不知道如何在运行我的测试套件之前正确初始化 Viper 值。任何帮助将非常感激。


慕侠2389804
浏览 136回答 2
2回答

温温酱

我找到了一种使用多级子命令测试命令的简单方法,它不专业但效果很好。假设我们有这样的命令RootCmd = &cobra.Command{            Use:   "cliName",            Short: "Desc",    }SubCmd = &cobra.Command{            Use:   "subName",            Short: "Desc",    }subOfSubCmd = &cobra.Command{            Use:   "subOfSub",            Short: "Desc",            Run: Exec    }//commands relationshipRootCmd.AddCommand(SubCmd)SubCmd.AddCommand(subOfSubCmd)在测试 subOfSubCmd 时,我们可以这样做:func TestCmd(t *testing.T) {convey.Convey("test cmd", t, func() {    args := []string{"subName", "subOfSub"}    RootCmd.SetArgs(args)    RootCmd.Execute()    })}

慕容3067478

当我使用 Cobra/Viper 或任何其他 CLI 助手组合时,我这样做的方法是让 CLI 工具运行一个函数,其唯一目的是获取参数并将它们传递给另一个将执行实际工作的方法。这是一个使用 Cobra 的简短(愚蠢)示例:package mainimport (        "fmt"        "os"        "github.com/spf13/cobra")func main() {        var Cmd = &cobra.Command{                Use:   "boom",                Short: "Explode all the things!",                Run:   Boom,        }        if err := Cmd.Execute(); err != nil {                fmt.Println(err)                os.Exit(-1)        }}func Boom(cmd *cobra.Command, args []string) {        boom(args...)}func boom(args ...string) {        for _, arg := range args {                println("boom " + arg)        }}在这里,Boom功能很难测试,但boom很容易。你可以看到这另一个(非哑)例子这里(和对应的测试在这里)。
随时随地看视频慕课网APP

相关分类

Go
我要回答