макет исправления нескольких пользовательских вводов в последовательности

#python #testing #mocking

#python #тестирование #издевательство

Вопрос:

подобные вопросы задавались много раз, но я, похоже, не могу разобраться в этом простом тесте, который я пытаюсь создать: я хотел бы сначала указать «y», а затем «n» для сложной функции, требующей ввода пользователем (т. Е. Для нее требуется два ввода последовательно). Это моя попытка — оператор with не продвигает итератор, но я не знаю, как бы я иначе реализовал исправленный ввод.

 import mock

m = mock.Mock()
m.side_effect = ["y","n"]
    
@pytest.fixture(scope="module")
def test_my_complex_function():
    with mock.patch('builtins.input', return_value=m()):
        out = my_complex_function(some_args)
    return out
 

Комментарии:

1. Этот ввод / ответы являются последовательными?

2. строки — сначала «y», затем «n»

Ответ №1:

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

module.py

 def complex_function():
    first = input("First input")
    second = input("Second input")
    return first, second
 

И вы хотели бы издеваться над input встроенным методом. Вы были на правильном пути, единственное, что нужно исправить, это то, что вам нужно создать 2 макета. По одному для каждого input экземпляра.

test_module.py

 import pytest

from unittest.mock import Mock, patch

from module import complex_function

input_mock_y = Mock()  # First mock for first input call
input_mock_n = Mock()  # Second mock for second input call

input_mock = Mock()    # Combine the 2 mocks in another mock to patch the input call.
input_mock.side_effect = [input_mock_y.return_value, input_mock_n.return_value]

def test_my_complex_function():
    with patch('builtins.input', input_mock) as mock_input:
        result = complex_function()
    
    assert mock_method.call_count == 2

 

Вы можете сказать: хорошо, но как я узнаю, что каждый ввод был исправлен правильно?
Таким образом, вы можете выделить некоторое возвращаемое значение для любого макета ввода, чтобы вы могли сравнивать.

 input_mock_y = Mock()
input_mock_y.return_value = "Y"

input_mock_n = Mock()
input_mock_n.return_value = "N"

input_mock = Mock()
input_mock.side_effect = [input_mock_y.return_value, input_mock_n.return_value]

def test_my_complex_function():
    with patch('builtins.input', input_mock) as mock_method:
        result = function()
    
    assert mock_method.call_count == 2
    assert result == ('Y', 'N')