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

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

Patricia Arquette
リリース: 2024-12-09 06:27:06
オリジナル
671 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート