首页 >后端开发 >Golang >为什么我的 Go 使用 `os.Args` 进行参数传递测试失败,如何修复?

为什么我的 Go 使用 `os.Args` 进行参数传递测试失败,如何修复?

Patricia Arquette
Patricia Arquette原创
2024-12-09 06:27:06672浏览

Why Does My Go Test for Argument Passing Using `os.Args` Fail, and How Can I Fix It?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn