为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

我找到了一种使用多级子命令测试命令的简单方法,它不专业但效果很好。


假设我们有这样的命令


RootCmd = &cobra.Command{

            Use:   "cliName",

            Short: "Desc",

    }


SubCmd = &cobra.Command{

            Use:   "subName",

            Short: "Desc",

    }


subOfSubCmd = &cobra.Command{

            Use:   "subOfSub",

            Short: "Desc",

            Run: Exec

    }


//commands relationship

RootCmd.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()

    })

}



查看完整回答
反对 回复 2021-12-20
?
慕容3067478

TA贡献1773条经验 获得超3个赞

当我使用 Cobra/Viper 或任何其他 CLI 助手组合时,我这样做的方法是让 CLI 工具运行一个函数,其唯一目的是获取参数并将它们传递给另一个将执行实际工作的方法。


这是一个使用 Cobra 的简短(愚蠢)示例:


package main


import (

        "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很容易。


你可以看到这另一个(非哑)例子这里(和对应的测试在这里)。


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信