Test de la réussite de l'argument dans Go
Problème :
Lors de la rédaction d'un test pour vérifier l'argument en passant Go en utilisant os.Args, cela entraîne un comportement inattendu où l'argument attendu n'est pas reçu par le fonction.
Extrait de code :
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) } }
Tentative :
Le test suivant échoue, indiquant que l'argument est ne pas être passé correctement :
--- FAIL: TestArgs (0.00s) args_test.go:15: Test failed, expected: 'bla', got: 'root' FAIL coverage: 87.5% of statements FAIL tool 0.008s
Solution :
Le problème réside dans l'affectation de os.Args. La syntaxe doit être :
os.Args = []string{"cmd", "-user=bla"}
De plus, il est recommandé de conserver la valeur d'origine de os.Args avant le test et de la restaurer par la suite :
oldArgs := os.Args defer func() { os.Args = oldArgs }()
Cela empêche d'autres tests d'être affecté par la modification de os.Args.
Explication :
La tranche os.Args est une "variable globale" qui contient les arguments d'origine transmis au programme. En attribuant une nouvelle tranche à os.Args, nous remplaçons effectivement les arguments d'origine. Le premier élément de os.Args est généralement le chemin d'accès à l'exécutable. En ajoutant "cmd" à la liste d'arguments, nous garantissons que la fonction reçoit la valeur d'argument correcte.
Restaurer la valeur d'origine de os.Args après le test est une bonne pratique pour maintenir un environnement cohérent pour les autres tests.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!