17

特定のコマンド ライン フラグが列挙内にあることを確認する単体テストが必要です。

テストを書きたいコードは次のとおりです。

var formatType string

const (
    text = "text"
    json = "json"
    hash = "hash"
)

func init() {
    const (
        defaultFormat = "text"
        formatUsage   = "desired output format"
    )

    flag.StringVar(&formatType, "format", defaultFormat, formatUsage)
    flag.StringVar(&formatType, "f", defaultFormat, formatUsage+" (shorthand)")

}

func main() {
    flag.Parse()
}

目的のテストは、-format が上記の const 値のいずれかに等しい場合にのみ合格します。この値は、formatType で使用できます。正しい呼び出しの例: program -format text

望ましい動作をテストする最良の方法は何ですか?

注:言い方が悪いのかもしれませんが、表示されたコードは単体テスト自体ではなく、単体テストを書きたいコードです。これは私が書いているツールの簡単な例であり、ツールへの有効な入力をテストする良い方法があるかどうかを尋ねたかった.

4

4 に答える 4

14

パッケージflag.Var内の関数を使用して、フラグのカスタム テストと処理を実行できます。flag

Flag.Var 「指定された名前と使用法文字列でフラグを定義します。フラグの型と値は、通常、Value のユーザー定義の実装を保持する Value 型の最初の引数によって表されます。」

Aは、次のように定義されflag.Valueたインターフェイスを満たす任意の型です。Value

type Value interface {
    String() string
    Set(string) error
}

パッケージソースのexample_test.goファイルに良い例がありますflag

ユースケースでは、次のようなものを使用できます。

package main

import (
    "errors"
    "flag"
    "fmt"
)

type formatType string

func (f *formatType) String() string {
    return fmt.Sprint(*f)
}

func (f *formatType) Set(value string) error {
    if len(*f) > 0 && *f != "text" {
        return errors.New("format flag already set")
    }
    if value != "text" && value != "json" && value != "hash" {
        return errors.New("Invalid Format Type")
    }
    *f = formatType(value)
    return nil
}

var typeFlag formatType

func init() {
    typeFlag = "text"
    usage := `Format type. Must be "text", "json" or "hash". Defaults to "text".`
    flag.Var(&typeFlag, "format", usage)
    flag.Var(&typeFlag, "f", usage+" (shorthand)")
}

func main() {
    flag.Parse()
    fmt.Println("Format type is", typeFlag)
}

これはおそらくこのような単純な例ではやり過ぎですが、より複雑なフラグ タイプを定義する場合には非常に便利です (リンクされた例では、カンマ区切りの間隔のリストを に基づくカスタム タイプのスライスに変換しますtime.Duration)。

編集: フラグに対して単体テストを実行する方法に対する回答として、最も標準的な例はflag_test.goフラグ パッケージ source にあります。カスタム フラグ変数のテストに関連するセクションは、181 行目から始まります。

于 2013-07-02T10:36:17.550 に答える