Menguji Argumen Lulus dalam Go
Masalah:
Apabila menulis ujian untuk mengesahkan hujah menghantar Go menggunakan os.Args, ia menghasilkan tingkah laku yang tidak dijangka di mana hujah yang dijangkakan tidak diterima oleh fungsi.
Snippet Kod:
package main import ( "flag" "fmt" "testing" "os" ) 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 } 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) } }
Percubaan:
Ujian berikut gagal, menunjukkan bahawa hujah adalah tidak dilalui dengan betul:
--- FAIL: TestArgs (0.00s) args_test.go:15: Test failed, expected: 'bla', got: 'root' FAIL coverage: 87.5% of statements FAIL tool 0.008s
Penyelesaian:
Isunya terletak pada penugasan os.Args. Sintaks hendaklah:
os.Args = []string{"cmd", "-user=bla"}
Selain itu, disyorkan untuk mengekalkan nilai asal os.Args sebelum ujian dan memulihkannya selepas itu:
oldArgs := os.Args defer func() { os.Args = oldArgs }()
Ini menghalang ujian lain daripada menjadi dipengaruhi oleh pengubahsuaian os.Args.
Penjelasan:
Kepingan os.Args ialah "pembolehubah global" yang mengandungi argumen asal yang dihantar kepada atur cara. Dengan memberikan kepingan baharu kepada os.Args, kami menggantikan hujah asal dengan berkesan. Elemen pertama os.Args lazimnya ialah laluan ke boleh laku. Dengan menambahkan "cmd" pada senarai argumen, kami memastikan bahawa fungsi menerima nilai argumen yang betul.
Memulihkan nilai asal os.Args selepas ujian adalah amalan yang baik untuk mengekalkan persekitaran yang konsisten untuk ujian lain.
Atas ialah kandungan terperinci Mengapa My Go Test untuk Lulus Hujah Menggunakan `os.Args` Gagal, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!