Przede wszystkim MagicMock
jest podklasą Mock
.
class MagicMock(MagicMixin, Mock)
W rezultacie MagicMock zapewnia wszystko, co zapewnia Mock, a nawet więcej. Zamiast myśleć o Mocku jako o okrojonej wersji MagicMock, pomyśl o MagicMock jako rozszerzonej wersji Mocka. Powinno to odpowiedzieć na Twoje pytania o to, dlaczego Mock istnieje i co zapewnia Mock oprócz MagicMock.
Po drugie, MagicMock zapewnia domyślne implementacje wielu / większości magicznych metod, podczas gdy Mock nie. Zobacz tutaj, aby uzyskać więcej informacji na temat dostępnych metod magicznych.
Kilka przykładów dostarczonych metod magicznych:
>>> int(Mock())
TypeError: int() argument must be a string or a number, not 'Mock'
>>> int(MagicMock())
1
>>> len(Mock())
TypeError: object of type 'Mock' has no len()
>>> len(MagicMock())
0
I te, które mogą nie być tak intuicyjne (a przynajmniej dla mnie nie intuicyjne):
>>> with MagicMock():
... print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>
Możesz "zobaczyć" metody dodane do MagicMock, gdy te metody są wywoływane po raz pierwszy:
>>> magic1 = MagicMock()
>>> dir(magic1)
['assert_any_call', 'assert_called_once_with', ...]
>>> int(magic1)
1
>>> dir(magic1)
['__int__', 'assert_any_call', 'assert_called_once_with', ...]
>>> len(magic1)
0
>>> dir(magic1)
['__int__', '__len__', 'assert_any_call', 'assert_called_once_with', ...]
Dlaczego więc nie używać MagicMock przez cały czas?
Pytanie do ciebie brzmi: czy zgadzasz się z domyślnymi implementacjami metod magii? Na przykład, czy mocked_object[1]
można nie popełniać błędów? Czy nie przeszkadzają ci niezamierzone konsekwencje z powodu istniejących już implementacji magicznych metod?
Jeśli odpowiedź na te pytania brzmi „tak”, użyj programu MagicMock. W przeciwnym razie trzymaj się Mocka.