此问题已在此处提出 Pytest: How to test a function with input call?
但是mareoraft(如下)的答案不适用于函数调用,它仅在当前测试函数范围内起作用。
原始答案:
def test_something_that_involves_user_input(monkeypatch):
# monkeypatch the "input" function, so that it returns "Mark".
# This simulates the user entering "Mark" in the terminal:
monkeypatch.setattr('builtins.input', lambda x: "Mark")
# go about using input() like you normally would:
i = input("What is your name?")
assert i == "Mark"
这是测试代码,我在其中将输入移至另一个函数(此操作失败)
def separate_input_function():
a = input()
return a
def test_separate_function_monkeypatch_input(monkeypatch):
ans = '3'
with monkeypatch.context() as m:
m.setattr('builtins.input', lambda prompt: ans)
result = separate_input_function()
assert result == ans
这引起了
TypeError: <lambda>() missing 1 required positional argument: 'prompt'
关于如何使它起作用的任何想法?
谢谢
答案 0 :(得分:1)
您的问题与将input
移至单独的功能无关,甚至与猴子修补无关。它与传递错误数量的参数有关,就像错误消息中所说的那样。
在您参考的示例中,monkeypatching函数定义为采用一个参数,而input
调用传递一个参数。
如果您自己尝试,则将Monkeypatching函数定义为采用一个参数,但是input
调用未传递任何参数。
您可以将其定义为采用可选参数,就像实际输入一样:
m.setattr('builtins.input', lambda prompt="": ans)
答案 1 :(得分:0)
修补程序的另一种方法是称为“依赖注入”的技术:
def separate_input_function(_input=input):
a = _input()
return a
def test_separate_function_monkeypatch_input(monkeypatch):
_input = lambda: 42
result = separate_input_function(_input=_input)
assert result == 42
也许有帮助。