如何在单元测试调用的函数中间模拟用户输入(使用 Python 3 的单元测试)?例如,我有一个函数 foo()
我正在测试谁的输出。在 foo()
函数,它要求用户输入:
x = input(msg)
输出基于输入:
print("input: {0}".format(x))
我希望我的单元测试运行
foo()
,输入一个输入并将结果与预期结果进行比较。
最佳答案
当我尝试测试为用户输入带来对话框的代码时,我经常遇到这个问题,并且相同的解决方案应该适用于两者。您需要提供一个绑定(bind)到名称 input
的新函数在您的测试范围内,具有与标准 input
相同的签名只返回一个测试值而不实际提示用户的函数。根据您的测试和代码的设置方式,可以通过多种方式完成此注入(inject),因此我将把它作为练习留给读者,但您的替换方法将很简单,例如:
def my_test_input(message):
return 7
显然你也可以打开
message
的内容。如果那是相关的,当然返回您选择的数据类型。您还可以做一些更灵活和通用的事情,允许在多种情况下重用相同的替换方法:def my_test_input(retval, message):
return retval
然后将部分函数注入(inject)
input
:import functools
test_input_a = functools.partial(my_test_input, retval=7)
test_input_b = functools.partial(my_test_input, retval="Foo")
离开
test_input_a
和 test_input_b
作为采用单个 message
的函数参数,使用 retval
参数已经绑定(bind)。
关于unit-testing - Python 3 unittest 模拟用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1329172/