Maison >développement back-end >Golang >Pourquoi mon test Go pour la transmission d'arguments à l'aide de « os.Args » échoue-t-il et comment puis-je y remédier ?

Pourquoi mon test Go pour la transmission d'arguments à l'aide de « os.Args » échoue-t-il et comment puis-je y remédier ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-09 06:27:06672parcourir

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

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn