Вопрос

Я пытаюсь смоделировать функцию бесконечного генератора, используя 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top