php小編魚仔發現,在進行互動測試時,有時會遇到問題。其中一個常見問題是,當使用命令列介面(CLI)進行互動時,掃描器可能不會等待使用者輸入。這表示當提示使用者輸入時,程式會立即繼續執行,而不會等待使用者的回應。這可能導致程式出現錯誤或無法正確執行。解決這個問題的方法是使用適當的技術或方法來確保掃描器等待使用者輸入,以確保互動測試的順利進行。
我嘗試編寫一個測試來驗證 cli 提示,模擬使用者輸入以回應某些程式輸出。
如何讓 scanner.scan
等待其餘的寫入?
到目前為止我所擁有的:
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) }
預期結果為:0123
實際結果為:0
#我嘗試了 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) }
結果:致命錯誤:所有 goroutine 都在休眠 - 死鎖!
使用管道時,寫入和讀取是同步的。如果沒有匹配的讀取,寫入就無法完成。將第一個寫入移至 goroutine 中。並關閉管道的寫入端,讓掃描器停止掃描。
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) }
以上是交互測試 cli 提示時出現問題,掃描器不等待使用者輸入的詳細內容。更多資訊請關注PHP中文網其他相關文章!