Вернуться Iterable With Mock Python
Я пытаюсь использовать Mock для имитации функции в python. Вот мой код:
resp, content = request(...)
Функция request() должна возвращать два значения. Вот что я пробовал:
with patch("syncdatetime.py") as sync_mock:
sync_mock.request.return_value = [obj, '']
Но когда я запускаю тест, я получаю сообщение об ошибке "Mock object is is iterable". Функция запроса возвращает объект типа Mock вместо списка. Как я могу исправить функцию запроса, чтобы она вернула список?
Ответы
Ответ 1
Примечание о раскрытии информации, я новичок в том, чтобы издеваться над тем, что я не эксперт, однако, я только что перенес такую же проблему и обнаружил, что установка атрибута side_effect
для функции, возвращающей массив, фиксирует вещи
В вашем примере кода измените:
with patch("syncdatetime.py") as sync_mock:
sync_mock.request.return_value = [obj, '']
к
with patch("syncdatetime.py") as sync_mock:
sync_mock.request.side_effect = function_returning_list
и определите
def function_returning_list(arg_list_of_choice):
#anything you want to do goes here
#then
return your_list
Ответ 2
Я подозреваю, что ваша проблема в том, что вы не используете экземпляр макета, который, по вашему мнению, вы есть. По умолчанию экземпляр Mock возвращает Mock при вызове.
>>> m = mock.Mock()
>>> type(m())
<class 'mock.mock.Mock'>
Похоже, ваш вызов request
возвращает Mock, потому что return_value
не был инициализирован, что означает, что resp, content = request()
пытается распаковать объект Mock.
>>> m = mock.Mock()
>>> (a, b) = m()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Mock' object is not iterable
Вам не нужно использовать side_effect
для возврата списка. Назначение return_value
должно работать.
>>> m = mock.Mock()
>>> m.return_value = ['a', 'b']
>>> (a, b) = m()
>>> a
'a'
>>> b
'b'