首頁 >後端開發 >Golang >如何在 Go 中對命令列標誌枚舉驗證進行單元測試?

如何在 Go 中對命令列標誌枚舉驗證進行單元測試?

Barbara Streisand
Barbara Streisand原創
2024-11-17 10:57:02948瀏覽

How to Unit Test Command Line Flag Enumeration Validation in Go?

Go 中的單元測試命令列標誌

在Go 中,為命令列應用程式定義自訂標誌需要徹底的測試過程以確保其正確性。特定場景涉及驗證特定標誌的值是否落在預先定義的枚舉範圍內。

要測試的程式碼

<code class="go">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()
}</code>

測試方法

為了對所需的行為進行單元測試,我們可以利用flag.Var 函數的力量,它允許我們定義標誌的自訂類型和驗證規則。

<code class="go">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
}</code>

在此自訂類型實作中:

  • String() 以字串形式傳回標誌的目前值。
  • Set() 更新標誌的值並確保它落在允許的範圍內列舉。

透過使用此自訂 formatType 標誌,測試過程現在可以驗證該標誌在設定為各種值時的行為。

範例測試

<code class="go">package main

import "testing"

func TestFormatType(t *testing.T) {
    tests := []struct {
        args   []string
        expect string
    }{
        {[]string{"-format", "text"}, "text"},
        {[]string{"-f", "json"}, "json"},
        {[]string{"-format", "foo"}, "Invalid Format Type"},
    }

    for _, test := range tests {
        t.Run(test.args[0], func(t *testing.T) {
            flag.Parse()
            if typeFlag != test.expect {
                t.Errorf("Expected %s got %s", test.expect, typeFlag)
            }
        })
    }
}</code>

在此範例:

  • TestFormatType 迭代測試清單。
  • 每個測試都會設定命令列參數,解析標誌,並將產生的 typeFlag 值與預期結果進行比較。
  • 如果任何測試失敗,則會報告錯誤。

以上是如何在 Go 中對命令列標誌枚舉驗證進行單元測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn