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