Para empezar, MagicMock
es una subclase de Mock
.
class MagicMock(MagicMixin, Mock)
Como resultado, MagicMock proporciona todo lo que proporciona Mock y más. En lugar de pensar en Mock como una versión simplificada de MagicMock, piense en MagicMock como una versión extendida de Mock. Esto debería responder a sus preguntas sobre por qué existe Mock y qué proporciona Mock además de MagicMock.
En segundo lugar, MagicMock proporciona implementaciones predeterminadas de muchos / la mayoría de los métodos mágicos, mientras que Mock no. Consulte aquí para obtener más información sobre los métodos mágicos proporcionados.
Algunos ejemplos de métodos mágicos proporcionados:
>>> 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
Y estos que pueden no ser tan intuitivos (al menos no intuitivos para mí):
>>> with MagicMock():
... print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>
Puede "ver" los métodos agregados a MagicMock a medida que se invocan por primera vez:
>>> 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', ...]
Entonces, ¿por qué no usar MagicMock todo el tiempo?
La pregunta para usted es: ¿Está de acuerdo con las implementaciones del método mágico por defecto? Por ejemplo, ¿está bien no cometer mocked_object[1]
errores? ¿Estás de acuerdo con las consecuencias imprevistas debido a que las implementaciones del método mágico ya están allí?
Si la respuesta a estas preguntas es sí, entonces siga adelante y use MagicMock. De lo contrario, quédate con Mock.