在Go 中測試參數傳遞
問題:
寫測試來驗證參數時使用os.Args 傳入Go,會導致意外行為,即預期的參數沒有被接收到function.
程式碼片段:
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) } }
嘗試:
以下測試失敗,表示參數是沒有被通過正確:
--- FAIL: TestArgs (0.00s) args_test.go:15: Test failed, expected: 'bla', got: 'root' FAIL coverage: 87.5% of statements FAIL tool 0.008s
解:
問題出在os.Args 的賦值上。語法應該是:
os.Args = []string{"cmd", "-user=bla"}
此外,建議在測試前保留 os.Args的原始值,並在測試後恢復它:
oldArgs := os.Args defer func() { os.Args = oldArgs }()
這可以防止其他測試受修改影響os.Args.
解釋:
解釋:os.Args 切片是一個“全域變數”,其中包含傳遞給程式的原始參數。透過為 os.Args 分配一個新切片,我們有效地替換了原始參數。 os.Args 的第一個元素通常是可執行檔的路徑。透過在參數清單中新增“cmd”,我們確保函數接收正確的參數值。 測試後恢復 os.Args 的原始值是為其他測試維護一致環境的良好做法。以上是為什麼我的 Go 使用 `os.Args` 進行參數傳遞測試失敗,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!