Je crois comprendre que MagicMock est un surensemble de Mock qui fait automatiquement « méthodes magiques » fournissant ainsi de façon transparente pour le soutien des listes, des itérations et ainsi de suite ... Quelle est donc la raison de plaine Mock existante? N'est-ce pas juste une version allégée de MagicMock qui peut être pratiquement ignorée? La classe Mock connaît-elle des astuces qui ne sont pas disponibles dans MagicMock ?
Avec Mock, vous pouvez vous moquer des méthodes magiques mais vous devez les définir. MagicMock a «des implémentations par défaut de la plupart des méthodes magiques». .
Si vous n'avez pas besoin de tester de méthodes magiques, Mock est adéquat et n'apporte pas beaucoup de choses étrangères dans vos tests. Si vous avez besoin de tester de nombreuses méthodes magiques, MagicMock vous fera gagner du temps.
la source
Pour commencer,
MagicMock
est une sous-classe deMock
.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:
Et ceux qui peuvent ne pas être aussi intuitifs (du moins pas intuitifs pour moi):
Vous pouvez "voir" les méthodes ajoutées à MagicMock lorsque ces méthodes sont appelées pour la première fois:
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.
la source
Voici ce que dit la documentation officielle de python :
la source
J'ai trouvé un autre cas particulier où le simple
Mock
peut devenir plus utile queMagicMock
:La comparaison avec
ANY
peut être utile, par exemple, comparer presque toutes les clés entre deux dictionnaires où une valeur est calculée à l'aide d'un simulacre.Cela sera valable si vous utilisez
Mock
:alors qu'il soulèvera un
AssertionError
si vous avez utiliséMagicMock
la source