Pytest: Как проверить отдельную функцию с помощью входного вызова? - PullRequest
0 голосов
/ 09 сентября 2018

Этот вопрос был задан здесь Pytest: Как проверить функцию с помощью входного вызова?

Но ответ от 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 голосов
/ 10 сентября 2018

Альтернативой исправлению является метод под названием «внедрение зависимостей»:

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

Может быть, это поможет.

0 голосов
/ 09 сентября 2018

Ваша проблема не имеет ничего общего с перемещением input в отдельную функцию или даже с monkeypatching; это связано с передачей неправильного числа аргументов - как и в сообщении об ошибке.

В примере, на который вы ссылаетесь, функция monkeypatching определена как принимающая один параметр, а вызов input передает один аргумент.

Если ваша собственная попытка, функция monkeypatching определена для получения одного параметра, но вызов input не передает аргументов.

Вы можете просто определить его так, чтобы он принимал необязательный параметр, как настоящий ввод:

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