Макет бесконечного генератора на Python
-
26-12-2019 - |
Вопрос
Я пытаюсь смоделировать функцию бесконечного генератора, используя mock
библиотека.(Или unittest.mock
если у вас есть Python 3.3)
Вот минимальный рабочий пример бесконечного генератора.Если я смогу успешно высмеять это, то, надеюсь, смогу высмеять саму функцию, которую я использую.
import itertools
def infinite_generator():
thing = itertools.cycle([1, 2])
while True:
yield next(thing)
Это то, что я пробовал до сих пор:
import mock
import itertools
mock_func = mock.MagicMock()
mock_func.__iter__.return_value = itertools.cycle([1, 2])
Я хочу mock_func
функционировать точно так же, как infinite_generator
функции.
например ,Я ожидаю, что смогу сделать следующее:
>>> a = mock_func()
>>> next(a)
1
>>> next(a)
2
>>> next(a)
1
>>> next(a)
2
и т.д.
Однако, на данный момент next(a)
возвращает такие вещи, как
<MagicMock name='mock().__next__()' id='3043937712'>
Решение
Оставить в стороне __iter__
здесь, потому что вы не собираетесь повторять mock_func
сам объект:
mock_func.__iter__.return_value = itertools.cycle([1, 2])
Вместо этого:
>>> mock_func = mock.Mock()
>>> mock_func.return_value = itertools.cycle([1, 2])
>>> a = mock_func()
>>> next(a)
1
>>> next(a)
2
>>> next(a)
1
>>> next(a)
2
Не связан с StackOverflow