3

使用している Python スクリプトのユーザー入力をシミュレートしようとしていpy.testます。私が達成しようとしていることを表す基本的なコードを次に示します。

def ask():
    while True:
        age = input("Enter your age: ")
        if int(age) < 13:
            print("You are too young")
        else:
            name = input("Enter your name: ")
            break
    print("Welcome!")

ユーザー入力を模倣して出力を読みたいと思います。例は次のようになります。

@mock.patch('builtins.input', side_effect=['11'])
def test_invalid_age():
    ask()
    assert stdout == "You are too young"

flexmock組み込みのunittestモック システムよりも優れた代替手段である可能性もあると聞いたことがありますが、現時点では任意の解決策を採用します。

アップデート:

私はもう少し遊んで、これであるテストを持っています:

@mock.patch('builtins.input', side_effect=['11'])
def test_bad_params(self, input):
    ask()
    output = sys.stdout.getline().strip()
    assert output == "You are too young"

py.test を実行すると、次の結果が得られます。

E StopIteration /usr/lib/python3.3/unittest/mock.py:904:
StopIteration

「あなたは若すぎます」として、適切な標準出力呼び出しをキャプチャしました。

4

1 に答える 1