Как я могу проверить цикл с несколькими входными вызовами? - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь проверить функцию, которая зависит от нескольких пользовательских входов, чтобы вернуть какое-то значение.

Я уже искал несколько вариантов ответов здесь, но никто не смог решить мою проблему. Я видел вещи с параметризацией, фиктивным и обезьяньим патчем, но ничего не помогло. Я думаю, что многое из-за того, что я не совсем понимал концепции того, что делается, и не мог приспособиться к своей проблеме. Я видел предложение использовать внешний файл для этого, но я не буду зависеть от этого. Я пытаюсь с pytest и python 3.7.3

Функция, которую я хочу протестировать, выглядит примерно так

def function():
    usr_input = input('please enter a number: ')
    while True:
        if int(usr_input) < 5:
            usr_input = input('please, enter a value less then 5: ')
        else:
            break
    return usr_input

Я хочу знать, как я могу передать два входных значения для проверки функции, когда введенное значение недопустимо. Пример. Отправьте значения 6 и 2, задайте ожидаемое значение 2 и пройдите тест. Мои другие тесты выглядят так:

def test_input(monkeypatch):
    monkeypatch.setattr('builtins.input', lambda x: 6)
    test = function()
    assert test == 2

но для этого случая они зацикливаются. Это можно сделать только с помощью параметризации или другого простого кода?

EDIT

Я добавил int () в свое «если», как указывал Вим в принятом ответе, просто чтобы не допустить путаницы для будущих читателей. Я предполагаю, что приведение возможно.

1 Ответ

0 голосов
/ 07 июня 2019

Здесь две проблемы, вам нужно преобразовать ввод в число, иначе сравнение не удастся, сравнивая строку с числом: usr_input < 5. Обратите внимание, что реальное input никогда не вернет число, только строку.

После того, как вы это очистите, вы можете сделать monkeypatch input с вызываемой функцией, которая может вызвать разные значения при вызове:

def fake_input(the_prompt):
    prompt_to_return_val = {
        'please enter a number: ': '6',
        'please, enter a value less then 5: ': '2',
    }
    val = prompt_to_return_val[the_prompt]
    return val

def test_input(monkeypatch):
    monkeypatch.setattr('builtins.input', fake_input)
    test = function()
    assert test == 2

Если вы установите плагин pytest-mock, вы можете сделать это проще с помощью фиктивного API:

def test_input(mocker):
    mocker.patch('builtins.input', side_effect=["6", "2"])
    test = function()
    assert test == 2
...