php-Redakteur Yuzai stellte fest, dass bei der Durchführung interaktiver Tests manchmal Probleme auftreten. Eines der häufigsten Probleme besteht darin, dass der Scanner bei der Interaktion über die Befehlszeilenschnittstelle (CLI) möglicherweise nicht auf Benutzereingaben wartet. Das heißt, wenn der Benutzer zur Eingabe aufgefordert wird, setzt das Programm die Ausführung sofort fort, ohne auf die Antwort des Benutzers zu warten. Dies kann dazu führen, dass das Programm einen Fehler macht oder nicht korrekt ausgeführt wird. Die Lösung dieses Problems besteht darin, mithilfe geeigneter Techniken oder Methoden sicherzustellen, dass der Scanner auf Benutzereingaben wartet, um einen reibungslosen Interaktionstest sicherzustellen.
Ich versuche, einen Test zu schreiben, um eine CLI-Eingabeaufforderung zu validieren und Benutzereingaben als Reaktion auf eine Programmausgabe zu simulieren.
Wie lässt man scanner.scan
auf den Rest der Schreibvorgänge warten?
Was ich bisher habe:
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) }
Das erwartete Ergebnis ist: 0123
Das tatsächliche Ergebnis ist: 0
Ich habe die io.pipe-Version ausprobiert
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) }
Ergebnis: Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!
Bei der Verwendung von Pipes erfolgen Schreiben und Lesen synchron. Ohne einen passenden Lesevorgang kann der Schreibvorgang nicht abgeschlossen werden. Verschieben Sie den ersten Schreibvorgang in eine Goroutine. Und schließen Sie das Schreibende des Rohrs, damit der Scanner den Scanvorgang stoppt.
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) }
Das obige ist der detaillierte Inhalt vonProblem beim interaktiven Testen der CLI-Eingabeaufforderung: Der Scanner wartet nicht auf Benutzereingaben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!