F: Warum wurde MagicMock separat erstellt, anstatt die Fähigkeit nur in das Standard-Scheinobjekt zu falten?
A: Eine vernünftige Antwort ist, dass MagicMock so funktioniert, dass alle diese Protokollmethoden vorkonfiguriert werden, indem neue Mocks erstellt und festgelegt werden. Wenn also jeder neue Mock eine Reihe neuer Mocks erstellt und diese als Protokollmethoden und dann alle diese Protokolle festlegt Methoden haben eine Menge mehr Mocks erstellt und sie auf ihre Protokollmethoden gesetzt. Sie haben eine unendliche Rekursion ...
Was ist, wenn der Zugriff auf Ihr Modell als Containerobjekt ein Fehler sein soll - Sie möchten nicht, dass dies funktioniert? Wenn jeder Mock automatisch jede Protokollmethode hat, wird es viel schwieriger, dies zu tun. Außerdem übernimmt MagicMock einige dieser Vorkonfigurationen für Sie und legt Rückgabewerte fest, die möglicherweise nicht angemessen sind. Daher dachte ich, es wäre besser, diese Bequemlichkeit zu haben, bei der alles vorkonfiguriert und für Sie verfügbar ist, aber Sie können auch ein gewöhnliches Modell erstellen Objekt und konfigurieren Sie einfach die magischen Methoden, die Sie existieren möchten ...
Die einfache Antwort lautet: Verwenden Sie MagicMock einfach überall, wenn Sie dies wünschen.
Mit Mock Sie können magische Methoden verspotten , aber man muss sie definieren. MagicMock verfügt über "Standardimplementierungen der meisten magischen Methoden". .
Wenn Sie keine magischen Methoden testen müssen, ist Mock ausreichend und bringt nicht viele irrelevante Dinge in Ihre Tests ein. Wenn Sie viele magische Methoden testen müssen, spart Ihnen MagicMock einige Zeit.
quelle
Zunächst
MagicMock
ist eine Unterklasse vonMock
.Als Ergebnis bietet MagicMock alles, was Mock bietet, und mehr. Anstatt Mock als eine abgespeckte Version von MagicMock zu betrachten, sollten Sie sich MagicMock als eine erweiterte Version von Mock vorstellen. Dies sollte Ihre Fragen dazu beantworten, warum Mock existiert und was Mock zusätzlich zu MagicMock bietet.
Zweitens bietet MagicMock Standardimplementierungen vieler / der meisten magischen Methoden, während Mock dies nicht tut. Sehen Sie hier für weitere Informationen über die magischen Methoden zur Verfügung gestellt.
Einige Beispiele für bereitgestellte magische Methoden:
Und diese, die möglicherweise nicht so intuitiv sind (zumindest für mich nicht intuitiv):
Sie können die zu MagicMock hinzugefügten Methoden "sehen", wenn diese Methoden zum ersten Mal aufgerufen werden:
Warum also nicht immer MagicMock verwenden?
Die Frage an Sie lautet: Sind Sie mit den Standardimplementierungen der magischen Methode einverstanden? Ist es zum Beispiel in Ordnung
mocked_object[1]
, keinen Fehler zu machen? Sind Sie mit unbeabsichtigten Konsequenzen einverstanden, da die Implementierungen der magischen Methode bereits vorhanden sind?Wenn die Antwort auf diese Fragen Ja lautet, verwenden Sie MagicMock. Ansonsten bleib bei Mock.
quelle
Dies ist, was Python offizielle Dokumentation sagt:
quelle
Ich habe einen anderen speziellen Fall gefunden, in dem einfach
Mock
nützlicher sein kann alsMagicMock
:Ein Vergleich mit
ANY
kann beispielsweise nützlich sein, um fast jeden Schlüssel zwischen zwei Wörterbüchern zu vergleichen, bei denen ein Wert mithilfe eines Modells berechnet wird.Dies gilt, wenn Sie Folgendes verwenden
Mock
:während es ein erhöht,
AssertionError
wenn Sie verwendet habenMagicMock
quelle