Я використовую pythons mock.patch і хотів би змінити значення повернення для кожного виклику. Ось застереження: функція, яку виправляють, не має входів, тому я не можу змінити повернене значення на основі вхідних даних.
Ось мій код для довідок.
def get_boolean_response():
response = io.prompt('y/n').lower()
while response not in ('y', 'n', 'yes', 'no'):
io.echo('Not a valid input. Try again'])
response = io.prompt('y/n').lower()
return response in ('y', 'yes')
Мій тестовий код:
@mock.patch('io')
def test_get_boolean_response(self, mock_io):
#setup
mock_io.prompt.return_value = ['x','y']
result = operations.get_boolean_response()
#test
self.assertTrue(result)
self.assertEqual(mock_io.prompt.call_count, 2)
io.prompt
це просто незалежна від платформи (python 2 і 3) версія "введення". Тому в кінцевому рахунку я намагаюся знущатися над введенням користувачів. Я намагався використовувати список для повернення значення, але це не працює.
Видно, що якщо значення повернення щось недійсне, я просто отримаю тут нескінченний цикл. Тому мені потрібен спосіб врешті-решт змінити значення повернення, щоб мій тест фактично закінчився.
(Ще одним можливим способом відповісти на це питання може бути пояснення, як я міг імітувати введення користувача в тестовому модулі)
Не є дублем цього питання головним чином тому, що я не маю можливості змінювати дані.
Один із зауважень відповіді на це запитання - це те саме, але жодної відповіді / коментаря не надано.
is
порівняти рядкові букви. Не робіть цього. Те, що він працює (іноді), є лише деталізацією реалізації в CPython. Крім того, response is not 'y' or 'n' or 'yes' or 'no'
напевно, не робиш того, що ти думаєш, що це ...
response is not 'y' or 'n' or 'yes' or 'no'
в НЕ робити те , що ви думаєте , що він робить. Див. Як перевірити одну змінну на кілька значень? і ви не повинні використовуватиis
для порівняння рядкових значень, використовувати==
для порівняння значень , а не тотожностей об'єкта.