在Python中模拟无限生成器

时间:2014-06-05 10:34:41

标签: python unit-testing python-3.x mocking python-unittest

我正在尝试使用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_funcinfinite_generator函数完全相同。

e.g。我希望能够做到以下几点:

>>> a = mock_func()
>>> next(a)
1
>>> next(a)
2
>>> next(a)
1
>>> next(a)
2

但是,目前next(a)会返回

之类的内容

<MagicMock name='mock().__next__()' id='3043937712'>

1 个答案:

答案 0 :(得分:3)

在此处遗漏__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