Heim >Backend-Entwicklung >Golang >Warum schlägt mein Go-Test für die Argumentübergabe mit „os.Args' fehl und wie kann ich das Problem beheben?

Warum schlägt mein Go-Test für die Argumentübergabe mit „os.Args' fehl und wie kann ich das Problem beheben?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-09 06:27:06717Durchsuche

Why Does My Go Test for Argument Passing Using `os.Args` Fail, and How Can I Fix It?

Testen der Argumentübergabe in Go

Problem:

Beim Schreiben eines Tests zur Überprüfung des Arguments Die Übergabe von Go mithilfe von os.Args führt zu unerwartetem Verhalten, bei dem das erwartete Argument nicht von empfangen wird Funktion.

Codeausschnitt:

package main

import (
    "flag"
    "fmt"
    "testing"

    "os"
)

func passArguments() string {
    username := flag.String("user", "root", "Username for this server")
    flag.Parse()
    fmt.Printf("Your username is %q.", *username)

    usernameToString := *username
    return usernameToString
}

func TestArgs(t *testing.T) {
    expected := "bla"
    os.Args = []string{"-user=bla"}

    actual := passArguments()

    if actual != expected {
        t.Errorf("Test failed, expected: '%s', got:  '%s'", expected, actual)
    }
}

Versuch:

Der folgende Test schlägt fehl, was darauf hinweist, dass das Argument vorhanden ist nicht bestanden richtig:

--- FAIL: TestArgs (0.00s)
    args_test.go:15: Test failed, expected: 'bla', got:  'root'
FAIL
coverage: 87.5% of statements
FAIL    tool    0.008s

Lösung:

Das Problem liegt in der Zuweisung von os.Args. Die Syntax sollte wie folgt lauten:

os.Args = []string{"cmd", "-user=bla"}

Darüber hinaus wird empfohlen, den ursprünglichen Wert von os.Args vor dem Test beizubehalten und danach wiederherzustellen:

oldArgs := os.Args
defer func() { os.Args = oldArgs }()

Dies verhindert, dass andere Tests ausgeführt werden von der Änderung betroffen os.Args.

Erklärung:

Das os.Args-Slice ist eine „globale Variable“, die die ursprünglichen Argumente enthält, die an das Programm übergeben wurden. Indem wir os.Args ein neues Slice zuweisen, ersetzen wir effektiv die ursprünglichen Argumente. Das erste Element von os.Args ist normalerweise der Pfad zur ausführbaren Datei. Indem wir der Argumentliste „cmd“ voranstellen, stellen wir sicher, dass die Funktion den richtigen Argumentwert erhält.

Das Wiederherstellen des ursprünglichen Werts von os.Args nach dem Test ist eine gute Vorgehensweise, um eine konsistente Umgebung für andere Tests aufrechtzuerhalten.

Das obige ist der detaillierte Inhalt vonWarum schlägt mein Go-Test für die Argumentübergabe mit „os.Args' fehl und wie kann ich das Problem beheben?. 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