#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')