Comment tester l'analyse des arguments dans Go
Considérez le code Go suivant, qui analyse les arguments de ligne de commande à l'aide du package flag :
package main import ( "flag" "fmt" ) func main() { passArguments() } 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 }
Pour tester cette fonction, nous pouvons passer un argument au code compilé, comme indiqué ci-dessous :
./args -user=bla
Cela devrait donner le résultat :
Your username is "bla"
Cependant, si nous essayons de tester ce comportement avec le test suivant :
package main import ( "os" "testing" ) 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) } }
Nous recevons une erreur :
FAIL coverage: 87.5% of statements FAIL tool 0.008s
La raison de cet échec est que le simple fait de définir os.Args sur une nouvelle tranche ne transmet pas l'argument à la fonction. Pour résoudre ce problème, nous devons nous assurer que la toute première valeur de os.Args est un (chemin vers) l'exécutable lui-même, comme le démontre ce test révisé :
func TestArgs(t *testing.T) { expected := "bla" oldArgs := os.Args defer func() { os.Args = oldArgs }() os.Args = []string{"cmd", "-user=bla"} actual := passArguments() if actual != expected { t.Errorf("Test failed, expected: '%s', got: '%s'", expected, actual) } }
En différant la restauration de os.Args à son état d'origine, nous pouvons garantir que le test n'interfère pas avec d'autres tests susceptibles d'examiner les vrais arguments transmis lors de l'évocation de go test.
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!