Python中有没有一种方法可以模拟键盘输入到要求输入的功能?

时间:2020-01-10 15:15:27

标签: python-3.x input

我的代码中有一个函数要求用户输入:

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}。我想知道在单元测试之外是否可以做同样的事情。

我知道我可以重写代码,或在终端中使用管道。但是我对此是否可以通过上述方式解决感到好奇。

2 个答案:

答案 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

尽管如此,这必须在调用函数之前完成。