مولد لانهائي وهمي في بيثون
-
26-12-2019 - |
سؤال
أحاول الاستهزاء بوظيفة المولد اللانهائية باستخدام ملف mock
مكتبة.(أو unittest.mock
إذا كان لديك بايثون 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