Menguji os.Exit Senario dalam Go
Apabila menulis ujian yang melibatkan fungsi panggilan yang keluar dari program menggunakan os.Exit(), ia menjadi perlu untuk mengasingkan kesannya pada keseluruhan suite ujian. Untuk menangani cabaran ini, kami boleh memanfaatkan pendekatan berikut yang diilhamkan oleh pembentangan oleh Andrew Gerrand, ahli pasukan teras Go.
Diberikan fungsi yang menamatkan program melalui os.Exit():
package main import ( "fmt" "os" ) func Crasher() { fmt.Println("Going down in flames!") os.Exit(1) }
Buat kes ujian yang sepadan:
package main import ( "os" "os/exec" "testing" ) func TestCrasher(t *testing.T) { // Check if the BE_CRASHER environment variable is set to 1. if os.Getenv("BE_CRASHER") == "1" { Crasher() return } // Construct a command to re-run the test binary, limiting its execution to TestCrasher. cmd := exec.Command(os.Args[0], "-test.run=TestCrasher") // Set additional environment variables. cmd.Env = append(os.Environ(), "BE_CRASHER=1") // Execute the command. err := cmd.Run() // Verify the exit status of the command. if e, ok := err.(*exec.ExitError); ok && !e.Success() { return } // Report failure if the command ran with an unexpected exit code. t.Fatalf("process ran with err %v, want exit status 1", err) }
Kes ujian ini menggunakan semula ujian go dalam proses yang berasingan, mengasingkan pelaksanaan TestCrasher daripada suite yang lain. Ia juga menetapkan pembolehubah persekitaran (BE_CRASHER=1) yang disemak oleh proses yang dipanggil dan, jika ada, memanggil fungsi yang sedang diuji. Oleh itu, kami mengelakkan gelung tak terhingga dan memastikan kod keluar yang betul disahkan.
Atas ialah kandungan terperinci Bagaimana untuk Menguji Fungsi yang Memanggil os.Exit() dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!