Pytest:如何通过输入调用测试单独的函数?
Pytest: How to test a separate 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'
关于如何让它工作的任何想法?
谢谢
您的问题与将 input
移动到单独的函数无关,甚至与 monkeypatching 无关;它与传递错误数量的参数有关——正如错误消息所说。
在您引用的示例中,monkeypatching 函数被定义为接受一个参数,input
调用传递一个参数。
如果您自己尝试,monkeypatching 函数被定义为采用一个参数,但 input
调用不传递任何参数。
你可以只定义它接受一个可选参数,就像真正的输入一样:
m.setattr('builtins.input', lambda prompt="": ans)
修补的替代方法是一种称为 "dependency injection":
的技术
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
也许这有帮助。
这里有人问过这个问题
但 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'
关于如何让它工作的任何想法?
谢谢
您的问题与将 input
移动到单独的函数无关,甚至与 monkeypatching 无关;它与传递错误数量的参数有关——正如错误消息所说。
在您引用的示例中,monkeypatching 函数被定义为接受一个参数,input
调用传递一个参数。
如果您自己尝试,monkeypatching 函数被定义为采用一个参数,但 input
调用不传递任何参数。
你可以只定义它接受一个可选参数,就像真正的输入一样:
m.setattr('builtins.input', lambda prompt="": ans)
修补的替代方法是一种称为 "dependency injection":
的技术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
也许这有帮助。