Python Pytest:如何使用输入调用测试单独的函数?

Python Pytest:如何使用输入调用测试单独的函数?,python,pytest,monkeypatching,Python,Pytest,Monkeypatching,这里有人问过这个问题 但是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

这里有人问过这个问题

但是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"
这是我将输入移动到另一个函数的测试代码(这失败了)

这引起

TypeError: <lambda>() missing 1 required positional argument: 'prompt'
TypeError:()缺少1个必需的位置参数:“prompt”
你有什么办法让它发挥作用吗


谢谢

您的问题与将
输入
移动到单独的函数无关,甚至与monkeypatching无关;正如错误消息所说,这与传递错误数量的参数有关

在您提到的示例中,monkeypatching函数被定义为接受一个参数,
input
调用传递一个参数

如果您自己尝试,monkeypatching函数被定义为接受一个参数,但是
input
调用不传递任何参数

您可以将其定义为一个可选参数,就像实际输入一样:

m.setattr('builtins.input', lambda prompt="": ans)

修补的替代方法是一种称为“依赖项注入”的技术:

也许这有帮助

m.setattr('builtins.input', lambda prompt="": ans)
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