12

GoでWebアプリを開発しています。ここまでは順調ですが、今は Wercker を CI ツールとして統合し、テストに関心を持ち始めています。しかし、私のアプリは Cobra/Viper configuration/flags/environment_variables スキームに大きく依存しており、テスト スイートを実行する前に Viper の値を適切に初期化する方法がわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

17

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は簡単です。

これの別の(愚かではない)例をここで見ることができます(および対応するテストはここで)。

于 2016-03-06T14:08:03.733 に答える
1

複数レベルのサブコマンドでコマンドをテストする簡単な方法を見つけました。これは専門的ではありませんが、うまく機能しました。

このようなコマンドがあるとします

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()
    })
}
于 2019-07-23T06:34:34.757 に答える