首頁 > 後端開發 > Golang > 為什麼我的 Go 使用 `os.Args` 進行參數傳遞測試失敗,如何修復?

為什麼我的 Go 使用 `os.Args` 進行參數傳遞測試失敗,如何修復?

Patricia Arquette
發布: 2024-12-09 06:27:06
原創
667 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板