Pytest:如何使用输入调用测试单独的功能?

时间:2018-09-09 20:40:24

标签: python pytest monkeypatching

此问题已在此处提出 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'

关于如何使它起作用的任何想法?

谢谢

2 个答案:

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

也许有帮助。