2014-09-13 10 views
5

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.

+0

Co powiecie na podanie nieskończonego iteratora? 'mock = MagicMock (side_effect = itertools.cycle ([1,2]))'; Nie musisz wywoływać 'reset_mock'. – falsetru

+1

@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ść. –

+2

Czy próbowałeś ponownie przypisać 'side_effect'? – user2357112

Odpowiedz

3

Jak komentował użytkownik user2357112, ponowne przydzielenie pomocy side_effect rozwiąże problem.

>>> from mock import MagicMock 
>>> 
>>> lst = [1, 2] 
>>> mock = MagicMock(side_effect=lst) 
>>> mock(), mock() 
(1, 2) 
>>> mock.side_effect = lst # <------- 
>>> mock(), mock() 
(1, 2) 
+0

Dzięki, nawet nie pomyślałem o spróbowaniu tego. Pobiłeś @ user2357112 na pięścią. – wwii