Zunächst MagicMock
ist eine Unterklasse von Mock
.
class MagicMock(MagicMixin, Mock)
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:
>>> 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
Und diese, die möglicherweise nicht so intuitiv sind (zumindest für mich nicht intuitiv):
>>> with MagicMock():
... print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>
Sie können die zu MagicMock hinzugefügten Methoden "sehen", wenn diese Methoden zum ersten Mal aufgerufen werden:
>>> 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', ...]
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.