Maison > développement back-end > Golang > le corps du texte

Comment tester l'entrée imbriquée dans Go

王林
Libérer: 2024-02-14 12:00:11
avant
991 Les gens l'ont consulté

如何在 Go 中测试嵌套输入

l'éditeur php Youzi vous présente comment tester les entrées imbriquées dans Go. Lors de l'écriture de code Go, vous rencontrez souvent des situations dans lesquelles vous devez gérer des entrées imbriquées, telles que des données JSON imbriquées ou des tableaux multidimensionnels. Comment tester efficacement ces entrées imbriquées est une question clé. Cet article vous montrera quelques méthodes et techniques pratiques pour vous aider à tester facilement les entrées imbriquées dans Go et à garantir l'exactitude et la stabilité de votre code. Que vous soyez débutant ou développeur expérimenté, ces conseils vous seront très utiles lors de l’écriture et du test du code Go. Découvrons-le ensemble !

Contenu de la question

J'ai pour fonction d'utiliser os.stdin pour obtenir les commentaires de l'utilisateur

func (i input) getinput(stdin io.reader) (string, error) {
    reader := bufio.newreader(stdin)

    data, err := reader.readstring('\n')
    if err != nil {
        return "", fmt.errorf("get input error: %w", err)
    }

    return strings.replaceall(data, "\n", ""), nil
}

Copier après la connexion

Dans mon programme, j'ai besoin d'avoir 2 entrées :

  • D'abord utilisé pour obtenir des informations de base telles que le nom d'utilisateur
  • Le second est utilisé pour obtenir des informations supplémentaires qui dépendent de la première entrée
name,err := getinput(os.stdin)
if err != nil {
 // error handling.....
}

switch name {
  case "test":
    //do something...
    age, err := getinput(os.stdin)
    if err != nil {
      // error handling.....
    }
    fmt.println(age)

  case "another":
    // here another input
}
Copier après la connexion

Est-il possible d'écrire un test unitaire pour cette situation ? Pour tester une saisie utilisateur, j'ai utilisé cet extrait de code et cela fonctionne :

    var stdin bytes.Buffer
    stdin.Write([]byte(fmt.Sprintf("%s\n", tt.input)))
    GetInput(stdin)
Copier après la connexion

Mais cela ne fonctionne pas avec 2 entrées imbriquées

Solution de contournement

Envisagez peut-être d'utiliser une fonction qui renvoie un type spécifique de résultat et de la mettre dans un package séparé.

Depuis que j'ai vu nameage ,也许我们可以假设一个具体类型,例如 person mentionné pour clarification.

Il est important de noter que nous souhaitons inclure le lecteur réel comme paramètre, plutôt que d'avoir une référence codée en dur à os.stdin . Cela rend possible la simulation d’entrées imbriquées en premier lieu.

Dans ce cas, la signature de la méthode pourrait ressembler à ceci :

func nestedinput(input io.reader) (*person, error)
Copier après la connexion

Le type correspondant peut être :

type person struct {
    name string
    age  int
}
Copier après la connexion

Si vous avez maintenant fusionné vos extraits de code dans un fichier go complet, dans un répertoire séparé portant le nom input.go, cela pourrait ressembler à ceci :

package input

import (
    "bufio"
    "fmt"
    "io"
    "strconv"
    "strings"
)

func getinput(reader *bufio.reader) (string, error) {
    data, err := reader.readstring('\n')
    if err != nil {
        return "", fmt.errorf("get input error: %w", err)
    }

    return strings.replaceall(data, "\n", ""), nil
}

type person struct {
    name string
    age  int
}

func nestedinput(input io.reader) (*person, error) {
    reader := bufio.newreader(input)
    name, err := getinput(reader)
    if err != nil {
        return nil, err
    }

    switch name {
    case "q":
        return nil, nil
    default:
        agestr, err := getinput(reader)
        if err != nil {
            return nil, err
        }
        age, err := strconv.atoi(agestr)
        if err != nil {
            return nil, err
        }
        return &person{name: name, age: age}, nil
    }
}
Copier après la connexion

q 的输入返回 nil、nil et peut être utilisé pour terminer la saisie, par exemple si la requête est effectuée en boucle.

Tests unitaires

Tests unitaires

func test_nestedinput(t *testing.t)
Copier après la connexion

Le fichier nommé input_test.go devrait maintenant fournir les données d'entrée.

Puisque nestedinput 函数现在需要 io.reader est pris comme paramètre, nous pouvons simplement générer l'entrée requise, par exemple

input := strings.newreader("george\n26\n")
Copier après la connexion

Le test pourrait donc ressembler à ceci :

package input

import (
    "strings"
    "testing"
)

func Test_nestedInput(t *testing.T) {
    input := strings.NewReader("George\n26\n")
    person, err := NestedInput(input)
    if err != nil {
        t.Error("nested input failed")
    }
    if person == nil {
        t.Errorf("expected person, but got nil")
        return
    }
    if person.Name != "George" {
        t.Errorf("wrong name %s, expected 'George'", person.Name)
    }
    if person.Age != 26 {
        t.Errorf("wrong age %d, expected 26", person.Age)
    }
}
Copier après la connexion

Bien sûr, le test peut être étendu avec plus de détails. Cependant, comme vous pouvez le constater, cela simule une entrée imbriquée.

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!

source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal