模拟用户输入()

时间:2015-05-04 20:36:13

标签: python testing input mocking flexmock

我正在尝试模拟我使用py.test的python脚本的用户输入。这是一些基本代码,代表了我想要实现的目标:

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

确实抓住了适当的标准输出调用#34;你太年轻了#34;

1 个答案:

答案 0 :(得分:3)

ask在第一个太年轻的时候没有回来;它循环直到输入适当的年龄。如上所述,您需要提供所有它可能读取的字符串,然后在ask返回后执行所有断言。

@mock.patch('builtins.input', side_effect=['11', '13', 'Bob'])
def test_bad_params(self, input):
    ask()
    output = sys.stdout.getline().strip()
    assert output == "You are too young"
    # Check the output after "13" and "Bob" are entered as well!
    assert sys.stdout.getline().strip() == "Welcome!"