在 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中文网其他相关文章!