Cara Menguji Penghuraian Argumen dalam Go
Pertimbangkan kod Go berikut, yang menghuraikan argumen baris arahan menggunakan pakej bendera:
package main import ( "flag" "fmt" ) func main() { passArguments() } func passArguments() string { username := flag.String("user", "root", "Username for this server") flag.Parse() fmt.Printf("Your username is %q.", *username) usernameToString := *username return usernameToString }
Untuk menguji fungsi ini, kita boleh menghantar hujah kepada kod yang disusun, seperti yang ditunjukkan di bawah:
./args -user=bla
Ini sepatutnya menghasilkan output:
Your username is "bla"
Walau bagaimanapun, jika kita cuba menguji tingkah laku ini dengan ujian berikut:
package main import ( "os" "testing" ) func TestArgs(t *testing.T) { expected := "bla" os.Args = []string{"-user=bla"} actual := passArguments() if actual != expected { t.Errorf("Test failed, expected: '%s', got: '%s'", expected, actual) } }
Kami menerima ralat:
FAIL coverage: 87.5% of statements FAIL tool 0.008s
Sebab kegagalan ini adalah kerana hanya menetapkan os.Args kepada kepingan baharu tidak memberikan hujah kepada fungsi. Untuk menyelesaikan masalah ini, kita perlu memastikan bahawa nilai pertama dalam os.Args ialah (laluan ke) boleh laku sendiri, seperti yang ditunjukkan dalam ujian yang disemak ini:
func TestArgs(t *testing.T) { expected := "bla" oldArgs := os.Args defer func() { os.Args = oldArgs }() os.Args = []string{"cmd", "-user=bla"} actual := passArguments() if actual != expected { t.Errorf("Test failed, expected: '%s', got: '%s'", expected, actual) } }
Dengan menangguhkan pemulihan os.Args kepada keadaan asalnya, kami boleh memastikan bahawa ujian itu tidak mengganggu ujian lain yang mungkin meneliti hujah sebenar yang diluluskan semasa membangkitkan go ujian.
Atas ialah kandungan terperinci Bagaimana untuk Menguji Penghuraian Hujah Pakej `flag` Go dengan Betul dalam Ujian Unit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!