Maison > Article > développement back-end > Problème lors du test interactif de l'invite cli, le scanner n'attend pas la saisie de l'utilisateur
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.
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) }
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) }
Résultat : Erreur fatale : toutes les goroutines dorment - impasse !
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) }
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!