Heim >Backend-Entwicklung >Golang >Wie teste ich die Validierung der Befehlszeilen-Flag-Enumeration in Go?

Wie teste ich die Validierung der Befehlszeilen-Flag-Enumeration in Go?

Barbara Streisand
Barbara StreisandOriginal
2024-11-17 10:57:02948Durchsuche

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

Einheitentests von Befehlszeilen-Flags in Go

In Go erfordert die Definition benutzerdefinierter Flags für Befehlszeilenanwendungen einen gründlichen Testprozess, um sicherzustellen, dass sie funktionieren Richtigkeit. Ein spezifisches Szenario besteht darin, zu überprüfen, ob der Wert eines bestimmten Flags in eine vordefinierte Aufzählung fällt.

Code zum Testen

<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>

Testansatz

Um das gewünschte Verhalten einem Unit-Test zu unterziehen, können wir die Leistungsfähigkeit der flag.Var-Funktion nutzen, die es uns ermöglicht, benutzerdefinierte Typen und Validierungsregeln für Flags zu definieren.

<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>

In dieser benutzerdefinierten Typimplementierung :

  • String() gibt den aktuellen Wert des Flags in String-Form zurück.
  • Set() aktualisiert den Wert des Flags und stellt sicher, dass er innerhalb der zulässigen Aufzählung liegt.

Durch die Verwendung dieses benutzerdefinierten formatType-Flags kann der Testprozess nun das Verhalten des Flags validieren, wenn es auf verschiedene Werte eingestellt ist.

Beispieltest

<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>

In diesem Beispiel:

  • TestFormatType durchläuft eine Liste von Tests.
  • Jeder Test richtet Befehlszeilenargumente ein, analysiert die Flags und vergleicht den resultierenden typeFlag-Wert mit dem erwarteten Ergebnisse.
  • Wenn ein Test fehlschlägt, wird ein Fehler gemeldet.

Das obige ist der detaillierte Inhalt vonWie teste ich die Validierung der Befehlszeilen-Flag-Enumeration in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn