74

設定したい

sys.argv

そのため、さまざまな組み合わせで合格する単体テストを実行できます。以下は機能しません。

#!/usr/bin/env python
import argparse, sys
def test_parse_args():
    global sys.argv
    sys.argv = ["prog", "-f", "/home/fenton/project/setup.py"]
    setup = get_setup_file()
    assert setup == "/home/fenton/project/setup.py"
def get_setup_file():
    parser = argparse.ArgumentParser()
    parser.add_argument('-f')
    args = parser.parse_args()
    return args.file
if __name__ == '__main__':
    test_parse_args()

次に、ファイルを実行します。

pscripts % ./test.py                                                                                           
  File "./test.py", line 4
    global sys.argv
              ^
SyntaxError: invalid syntax
pscripts %  
4

9 に答える 9

100

実行時に sys.argv を変更することは、非常に脆弱なテスト方法です。特定のコード ブロック内で、1 つのオブジェクト (または属性、メソッド、関数など) を別のオブジェクトに置き換えるコンテキスト マネージャーとして使用できるmockpatch機能を使用する必要があります。

次の例では、 を使用して、指定された戻り値 ( ) でpatch()効果的に「置換」します。sys.argvtestargs

try:
    # python 3.4+ should use builtin unittest.mock not mock package
    from unittest.mock import patch
except ImportError:
    from mock import patch

def test_parse_args():
    testargs = ["prog", "-f", "/home/fenton/project/setup.py"]
    with patch.object(sys, 'argv', testargs):
        setup = get_setup_file()
        assert setup == "/home/fenton/project/setup.py"
于 2015-01-04T13:29:54.580 に答える
1

実際に呼び出していないため、機能しませんget_setup_file。コードは次のようになります。

import argparse

def test_parse_args():
    sys.argv = ["prog", "-f", "/home/fenton/project/setup.py"]
    setup = get_setup_file()  # << You need the parentheses
    assert setup == "/home/fenton/project/setup.py"
于 2013-09-07T02:09:53.650 に答える