2014-09-13 34 views
5

mock.reset_mock(), yan etki yineleyicisini sıfırlamayacaktır. Sahneyi yeniden oluşturmadan bunu yapmanın bir yolu var mı?Bitirildikten sonra bir sahte side_effect yineleyici sıfırlanabilir mi?

>>> 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) 
>>> 

niyet sonraki testlerde yeniden kullanmak alay etmektir ama bir jeneratör gibi, yeniden olamaz, şüpheli.

ben mock.py baktı ve side_effect (sıfırlama kez bitkin olamaz) bir yineleyici nesne olduğu tespit doğru yöne sonra Yani (geç olsun):

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 

ve def reset_mock() yan etkiyi ele almaz.

+0

Sonsuz yineleyiciyi iletmeye ne dersin? mock = MagicMock (side_effect = itertools.cycle ([1,2])) '; 'Reset_mock' çağırmanıza gerek yoktur. – falsetru

+1

@falsetru: ama sahte sonra yanlış kullanılırsa sahte sonraki yanlış çağrıyı verecektir. –

+2

"side_effect" i yeniden atamayı denediniz mi? – user2357112

cevap

3

Kullanıcı2357112 yorum yaptığında, side_effect'u yeniden atamanız sorunu çözecektir.

>>> 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

Teşekkürler, bunu denemeyi bile düşünmedim. Yumruk için @ user2357112 yendi. – wwii

İlgili konular