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

Problème lors du test interactif de l'invite cli, le scanner n'attend pas la saisie de l'utilisateur

WBOY
Libérer: 2024-02-13 21:18:18
avant
1171 Les gens l'ont consulté

交互测试 cli 提示时出现问题,扫描仪不等待用户输入

L'éditeur php Yuzai a découvert que lors de tests interactifs, des problèmes survenaient parfois. L'un des problèmes courants est que lors de l'interaction à l'aide de l'interface de ligne de commande (CLI), le scanner peut ne pas attendre la saisie de l'utilisateur. Cela signifie que lorsque l'utilisateur est invité à entrer une entrée, le programme continue son exécution immédiatement sans attendre la réponse de l'utilisateur. Cela peut entraîner une erreur du programme ou ne pas s'exécuter correctement. La solution à ce problème consiste à utiliser des techniques ou des méthodes appropriées pour garantir que le scanner attend la saisie de l'utilisateur afin de garantir des tests d'interaction fluides.

Contenu de la question

J'essaie d'écrire un test pour valider une invite cli, simulant une entrée utilisateur en réponse à une sortie de programme.

Comment faire attendre scanner.scan la suite des écritures ?

Ce que j'ai jusqu'à présent :

    b := &bytes.buffer{}
    fmt.fprint(b, "0")
    go func() {
        time.sleep(1 * time.second)
        for i := 1; i < 4; i++ {
            fmt.fprint(b, i)
            time.sleep(1 * time.second)
        }
    }()

    scanner := bufio.newscanner(b)
    for scanner.scan() {
        log.print(scanner.text())
    }
    if err := scanner.err(); err != nil {
        log.println("problem while scanning:", err)
    }
Copier après la connexion

Le résultat attendu est : 0123

Le résultat réel est : 0

J'ai essayé la version io.pipe

r, w := io.Pipe()
    fmt.Fprint(w, "0")
    go func() {
        time.Sleep(1 * time.Second)
        for i := 1; i < 4; i++ {
            fmt.Fprint(w, i)
            time.Sleep(1 * time.Second)
        }
    }()

    scanner := bufio.NewScanner(r)
    for scanner.Scan() {
        log.Print(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        log.Println("problem while scanning:", err)
    }
Copier après la connexion

Résultat : Erreur fatale : toutes les goroutines dorment - impasse !

Solution de contournement

Lors de l'utilisation de tuyaux, l'écriture et la lecture sont synchrones. Sans lecture correspondante, l'écriture ne peut pas se terminer. Déplacez la première écriture vers une goroutine. Et fermez l’extrémité d’écriture du tuyau pour que le scanner arrête la numérisation.

    r, w := io.Pipe()
    go func() {
        defer w.Close()

        fmt.Fprint(w, "0")

        time.Sleep(1 * time.Second)
        for i := 1; i < 4; i++ {
            fmt.Fprint(w, i)
            time.Sleep(1 * time.Second)
        }
    }()

    scanner := bufio.NewScanner(r)
    for scanner.Scan() {
        log.Print(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        log.Println("problem while scanning:", err)
    }
Copier après la connexion

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