P: Dlaczego MagicMock został utworzony jako osobna rzecz, a nie tylko składając zdolność do domyślnego obiektu pozorowanego?
Odp .: Jedną rozsądną odpowiedzią jest to, że sposób działania MagicMock polega na tym, że wstępnie konfiguruje wszystkie te metody protokołów, tworząc nowe makiety i ustawiając je, więc jeśli każda nowa próba tworzy kilka nowych makiet i ustawia je jako metody protokołów, a następnie wszystkie te protokoły metody stworzyły więcej makiet i ustawiły je na swoich metodach protokołów, masz nieskończoną rekursję ...
A co jeśli chcesz, aby dostęp do makiety jako obiektu kontenera był błędem - nie chcesz, aby to działało? Jeśli każdy model ma automatycznie wszystkie metody protokołu, wykonanie tego staje się znacznie trudniejsze. Ponadto MagicMock wykonuje część tej wstępnej konfiguracji za Ciebie, ustawiając wartości zwracane, które mogą nie być odpowiednie, więc pomyślałem, że lepiej byłoby mieć tę wygodną, która ma wszystko wstępnie skonfigurowane i dostępne dla Ciebie, ale możesz też wziąć zwykłą próbę obiekt i po prostu skonfiguruj magiczne metody, które chcesz istnieć ...
Prosta odpowiedź brzmi: po prostu używaj MagicMock wszędzie, jeśli chcesz takiego zachowania.
Z Mock Państwo mogą drwić magiczne metody, ale trzeba je zdefiniować. MagicMock ma „domyślne implementacje większości metod magicznych”. .
Jeśli nie musisz testować żadnych magicznych metod, Mock jest wystarczający i nie wnosi do testów wielu obcych rzeczy. Jeśli potrzebujesz przetestować wiele magicznych metod, MagicMock pozwoli Ci zaoszczędzić trochę czasu.
źródło
Przede wszystkim
MagicMock
jest podklasą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:
I te, które mogą nie być tak intuicyjne (a przynajmniej dla mnie nie intuicyjne):
Możesz "zobaczyć" metody dodane do MagicMock, gdy te metody są wywoływane po raz pierwszy:
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.
źródło
Oto, co mówi oficjalna dokumentacja Pythona :
źródło
Znalazłem inny szczególny przypadek, w którym proste
Mock
może okazać się bardziej przydatne niżMagicMock
:Porównywanie z
ANY
może być przydatne, na przykład porównując prawie każdy klucz między dwoma słownikami, w których pewna wartość jest obliczana za pomocą makiety.Będzie to ważne, jeśli używasz
Mock
:podczas gdy podniesie,
AssertionError
jeśli użyłeśMagicMock
źródło