سؤال

أحاول الاستهزاء بوظيفة المولد اللانهائية باستخدام ملف 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top