Pour commencer, MagicMock
est une sous-classe de Mock
.
class MagicMock(MagicMixin, Mock)
En conséquence, MagicMock fournit tout ce que Mock fournit et plus encore. Plutôt que de considérer Mock comme une version allégée de MagicMock, pensez à MagicMock comme une version étendue de Mock. Cela devrait répondre à vos questions sur la raison pour laquelle Mock existe et ce que Mock fournit en plus de MagicMock.
Deuxièmement, MagicMock fournit des implémentations par défaut de la plupart des méthodes magiques, contrairement à Mock. Voir ici pour plus d'informations sur les méthodes magiques fournies.
Quelques exemples de méthodes magiques fournies:
>>> 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
Et ceux qui peuvent ne pas être aussi intuitifs (du moins pas intuitifs pour moi):
>>> with MagicMock():
... print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>
Vous pouvez "voir" les méthodes ajoutées à MagicMock lorsque ces méthodes sont appelées pour la première fois:
>>> 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', ...]
Alors, pourquoi ne pas utiliser MagicMock tout le temps?
La question qui vous revient est la suivante: êtes-vous d'accord avec les implémentations de méthode magique par défaut? Par exemple, est-ce normal mocked_object[1]
de ne pas se tromper? Êtes-vous d'accord avec les conséquences imprévues dues aux implémentations de méthodes magiques déjà présentes?
Si la réponse à ces questions est oui, alors allez-y et utilisez MagicMock. Sinon, restez fidèle à Mock.