2013-07-19 16 views
5

Mam wiersza kodu, który jest:Jak Mock brakujący atrybut

if not hasattr(class.a, u'c'): 
    return 

Jak drwić z klasy tak, że class.a.c False dla hasattr?

Gdybym to zrobić:

>>> from mock import MagicMock 
>>> mock_class = MagicMock(spec=[u'a']) 
>>> hasattr(mock_class, u'a') 
True 
>>> hasattr(mock_class, u'b') 
False 
>>> hasattr(mock_class.a, u'c') 
True 

Chociaż nie niespełniającego class.a.c, jego jest wyśmiewany !!!

+0

Dlaczego nie usunąć go za pomocą [delattr] (http://docs.python.org/2.7/library/functions.html?highlight=delattr#delattr)? – twil

+0

Użyłem: del mock_class.a.c na końcu. Dzięki! –

Odpowiedz

3

Właściwie mock_class.a utworzy kolejny MagicMock, który nie ma specyfikacji. Jedynym sposobem mogę myśleć to przypisać atrybut a o mock_class z innym MagicMock ze specyfikacją, na przykład:

mock_class = MagicMock(spec=[u'a']) 
mock_class.a = MagicMock(spec=[u'a']) 
hasattr(mock_class.a, u'c') # returns False 

Także jeśli masz jakieś realne przedmioty, które chcesz szydzić, istnieje możliwość, aby zrobić niektóre recursive autospecing.

+0

Mogłem przysiąc, że próbowałem, ale to nie działało, ale próbowałem twojego przykładu zadziałało! –