我的代码中有一个函数要求用户输入:
def function_1():
...
x = input('Please provide input')
...
return something
我希望能够运行我的代码,并且当程序最终到达function_1
并要求用户输入时,会自动为其提供一些指定的输入。进行单元测试时,我可以使用模拟库来模拟键盘输入,如下所示:
@mock.patch('builtins.input', side_effects=[1,2,3])
function_1()
function_1()
function_1()
这将调用该函数三次,并提供输入{1, 2, 3}
。我想知道在单元测试之外是否可以做同样的事情。
我知道我可以重写代码,或在终端中使用管道。但是我对此是否可以通过上述方式解决感到好奇。
答案 0 :(得分:1)
一种方法是覆盖sys.stdin
:
import sys
from io import StringIO
oldstdin = sys.stdin
sys.stdin = StringIO("1\n2\n3\n")
assert input() == "1"
assert input() == "2"
assert input() == "3"
sys.stdin = oldstdin
答案 1 :(得分:1)
关于Python的伟大之处在于,您几乎可以覆盖任何函数,甚至是内置函数。
def override():
from itertools import count
counter = count()
return lambda *args, **kwargs: next(counter)
input = override()
def x():
return input("Testing123")
print(x()) # 1
print(x()) # 2
print(x()) # 3
尽管如此,这必须在调用函数之前完成。