Я использую 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) версия "input". Итак, в конечном итоге я пытаюсь высмеять ввод пользователей. Я пробовал использовать список для возвращаемого значения, но это не работает.
Вы можете видеть, что если возвращаемое значение является недопустимым, я просто получу здесь бесконечный цикл. Поэтому мне нужен способ в конечном итоге изменить возвращаемое значение, чтобы мой тест действительно завершился.
(еще один возможный способ ответить на этот вопрос - объяснить, как я могу имитировать ввод пользователя в модульном тесте)
Не дубликат этого вопроса в основном потому, что у меня нет возможность варьировать входы.
Один из комментариев к ответу на этот вопрос находится в том же духе, но ответа / комментария не было.
response is not 'y' or 'n' or 'yes' or 'no'
в не делать то, что вы думаете. См. Как проверить одну переменную на несколько значений? и вам не следует не использоватьis
для сравнения строковых значений. используйте==
для сравнения значений, а не идентификаторов объектов. - person Martijn Pieters   schedule 23.07.2014is
для сравнения строковых литералов. Не делай этого. Тот факт, что он работает (иногда), является лишь деталью реализации в CPython. Кроме того,response is not 'y' or 'n' or 'yes' or 'no'
, вероятно, не делает того, что вы думаете ... - person mgilson   schedule 23.07.2014@patch('foo.bar', side_effect=['ret1', ret2', 'ret3'])
. - person Acumenus   schedule 08.10.2020