繁体   English   中英

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

[英]Cobra + Viper Golang How to test subcommands?

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

当我使用 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一个很容易。

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

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

假设我们有这样的命令

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()
    })
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM