mock.reset_mock()
nie resetuje iteratora efektów ubocznych. Czy jest jakiś sposób, aby to zrobić bez tworzenia makiety?Czy fałszywy iterator strony bocznej może zostać zresetowany po jej wyczerpaniu?
>>> from mock import MagicMock
>>> mock = MagicMock(side_effect = [1,2])
>>> mock(), mock()
(1, 2)
>>> mock()
Traceback (most recent call last):
File "<pyshell#114>", line 1, in <module>
mock()
File "C:\Python27\Lib\site-packages\mock.py", line 955, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "C:\Python27\Lib\site-packages\mock.py", line 1013, in _mock_call
result = next(effect)
StopIteration
>>> mock.reset_mock()
>>> mock()
Traceback (most recent call last):
...
StopIteration
>>> mock = MagicMock(side_effect = [1,2])
>>> mock(), mock()
(1, 2)
>>>
Chodzi o to, aby ponownie użyć mock w kolejnych testach, ale podejrzewam, że podobnie jak prądnica, to nie może być wznowiona.
Tak (lepiej późno niż wcale) po czym wskazał w kierunku prawego Zajrzałem mock.py
i stwierdził, że side_effect
jest obiektem iterator (które nie mogą być zresetowane raz wyczerpany):
def __set_side_effect(self, value):
value = _try_iter(value)
...
def _try_iter(obj):
...
try:
return iter(obj)
except TypeError:
# XXXX backwards compatibility
# but this will blow up on first call - so maybe we should fail early?
return obj
i def reset_mock()
nie zajmuje się efektem ubocznym.
Co powiecie na podanie nieskończonego iteratora? 'mock = MagicMock (side_effect = itertools.cycle ([1,2]))'; Nie musisz wywoływać 'reset_mock'. – falsetru
@falsetru: ale jeśli próbka jest następnie używana niepoprawnie, następne połączenie z próbą dałoby niewłaściwą wartość. –
Czy próbowałeś ponownie przypisać 'side_effect'? – user2357112