ホームページ >バックエンド開発 >Golang >「os.Args」を使用した引数の受け渡しの Go テストが失敗するのはなぜですか?どうすれば修正できますか?

「os.Args」を使用した引数の受け渡しの Go テストが失敗するのはなぜですか?どうすれば修正できますか?

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 の元の値を復元することは、他のテストで一貫した環境を維持するための良い習慣です。

以上が「os.Args」を使用した引数の受け渡しの Go テストが失敗するのはなぜですか?どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。