Подтвердить что ты не робот

Вернуться 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 вместо списка. Как я могу исправить функцию запроса, чтобы она вернула список?

4b9b3361

Ответ 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'