Я использую 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». В конечном счете, я пытаюсь смоделировать ввод пользователей. Я попытался использовать список для возвращаемого значения, но это не работает.
Вы можете видеть, что если возвращаемое значение является чем-то недопустимым, я просто получу бесконечный цикл здесь. Поэтому мне нужен способ в конечном итоге изменить возвращаемое значение, чтобы мой тест фактически завершился.
(Другой возможный способ ответить на этот вопрос - объяснить, как я могу имитировать пользовательский ввод в модульном тесте)
Не дублируйте этот вопрос главным образом потому, что у меня нет возможности варьировать входные данные.
Один из комментариев Ответа на этот вопрос находится в том же духе, но ответ / комментарий предоставлен не был.
isдля сравнения строковых литералов. Не делай этого. Тот факт, что это работает (иногда), является лишь деталью реализации в CPython. Кроме того, response is not 'y' or 'n' or 'yes' or 'no'вероятно, не делает то, что вы думаете ...
response is not 'y' or 'n' or 'yes' or 'no'в не делать то , что вы думаете , что он делает. См. Как проверить одну переменную на несколько значений? и вы не должны использоватьisдля сравнения строковых значений, используйте==для сравнения значений , а не идентификаторов объектов.