Menguji Aplikasi Go dengan Input Stdin
Dalam Go, menguji aplikasi yang membaca daripada stdin boleh menjadi mencabar. Pertimbangkan aplikasi mudah yang menggemakan input stdin ke stdout. Walaupun ia kelihatan mudah, menulis kes ujian yang mengesahkan output boleh menimbulkan kesukaran.
Percubaan Gagal
Pendekatan awal adalah untuk mensimulasikan stdin dan stdout menggunakan paip dan tulis secara manual ke paip stdin. Walau bagaimanapun, ini mungkin membawa kepada keadaan perlumbaan dan kegagalan yang tidak dijangka.
Penyelesaian: Ekstrak Logik dan Fungsi Bebas Ujian
Daripada melaksanakan semua operasi dalam fungsi utama menggunakan stdin dan stdout, buat fungsi berasingan yang menerima io.Reader dan io.Writer sebagai parameter. Pendekatan ini membenarkan fungsi utama untuk memanggil fungsi sementara fungsi ujian mengujinya secara langsung.
Kod Refactored
<code class="go">package main import ( "bufio" "fmt" "io" ) // Echo takes an io.Reader and an io.Writer and echoes input to output. func Echo(r io.Reader, w io.Writer) { reader := bufio.NewReader(r) for { fmt.Print("> ") bytes, _, _ := reader.ReadLine() if bytes == nil { break } fmt.Fprintln(w, string(bytes)) } } func main() { Echo(os.Stdin, os.Stdout) }</code>
Kes Ujian Kemas Kini
<code class="go">package main import ( "bufio" "bytes" "io" "os" "testing" ) func TestEcho(t *testing.T) { input := "abc\n" reader := bytes.NewBufferString(input) writer := &bytes.Buffer{} Echo(reader, writer) actual := writer.String() if actual != input { t.Errorf("Wanted: %v, Got: %v", input, actual) } }</code>
Kes ujian ini mensimulasikan fungsi utama dengan memanggil fungsi Echo terus dengan penimbal untuk input stdin dan penimbal untuk menangkap output. Output yang ditangkap kemudiannya dibandingkan dengan input yang dijangkakan, memastikan fungsi itu menggemakan input dengan betul.
Atas ialah kandungan terperinci Bagaimana untuk Menguji Aplikasi Go yang Dibaca daripada Stdin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!