ホームページ  >  記事  >  バックエンド開発  >  Go で列挙型に対してコマンド ライン フラグ値を単体テストする方法

Go で列挙型に対してコマンド ライン フラグ値を単体テストする方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-05 09:59:02840ブラウズ

How to Unit Test Command Line Flag Values Against an Enumeration in Go?

Go でのコマンド ライン フラグのテスト

この記事では、Golang でのコマンド ライン フラグのテスト手法について説明します。具体的には、列挙型に対してフラグ値を単体テストする方法を検討します。

問題ステートメント

次のコードが与えられたとします。

<code class="go">// Define flag for output format
var formatType string

// Constants representing valid format types
const (
    text = "text"
    json = "json"
    hash = "hash"
)

// Initialize flags
func init() {
    flag.StringVar(&formatType, "format", "text", "Desired output format")
}

// Main function
func main() {
    flag.Parse()
}</code>

We -format フラグの値が事前定義された定数の 1 つと一致することを確認する単体テストを作成したいと考えています。

カスタム フラグ タイプを使用したソリューション

詳細なフラグをテストするには柔軟な方法で、Value インターフェイスを実装するカスタム タイプで flag.Var 関数を利用できます。

<code class="go">package main

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

// Custom type representing format type
type formatType string

// String() method for Value interface
func (f *formatType) String() string {
    return fmt.Sprint(*f)
}

// Set() method for Value interface
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
}

// Initialize flag with custom type
func init() {
    typeFlag := "text" // Default value
    usage := `Format type. Must be "text", "json" or "hash". Defaults to "text".`
    flag.Var(&typeFlag, "format", usage)
}

// Main function
func main() {
    flag.Parse()
    fmt.Println("Format type is", typeFlag)
}
</code>

このソリューションでは、flag.Var は、Value インターフェイスを満たすカスタム タイプへのポインタを受け取ります。 Set メソッド内で独自の検証ロジックを定義できます。

カスタム フラグ タイプの単体テスト

カスタム フラグ タイプの単体テストは次のように記述できます。

<code class="go">// Test unit validates that the format flag is within the enumeration
func TestFormatFlag(t *testing.T) {
    testCases := []struct {
        input       string
        expectedErr string
    }{
        {"text", ""},
        {"json", ""},
        {"hash", ""},
        {"", "Invalid Format Type"},
        {"xml", "Invalid Format Type"},
    }

    for _, tc := range testCases {
        t.Run(tc.input, func(t *testing.T) {
            args := []string{"-format", tc.input}
            flag.CommandLine = flag.NewFlagSet("test", flag.PanicOnError)
            err := flag.CommandLine.Parse(args)

            if err != nil && err.Error() != tc.expectedErr {
                t.Errorf("Unexpected error: %v", err)
                return
            }
        })
    }
}</code>

以上がGo で列挙型に対してコマンド ライン フラグ値を単体テストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。