Meu entendimento é que o MagicMock é um superconjunto do Mock que executa automaticamente "métodos mágicos", oferecendo suporte contínuo a listas, iterações e assim por diante ... Então, qual é o motivo da existência do Mock comum ? Não é apenas uma versão simplificada do MagicMock que pode ser praticamente ignorada? A classe Mock conhece algum truque que não está disponível no MagicMock ?
Com o Mock, você pode zombar de métodos mágicos, mas precisa defini-los. O MagicMock possui "implementações padrão da maioria dos métodos mágicos". .
Se você não precisa testar nenhum método mágico, o Mock é adequado e não traz muitas coisas estranhas para os testes. Se você precisar testar muitos métodos mágicos, o MagicMock economizará algum tempo.
fonte
Para começar,
MagicMock
é uma subclasse deMock
.Como resultado, o MagicMock fornece tudo o que o Mock fornece e muito mais. Em vez de pensar no Mock como uma versão simplificada do MagicMock, pense no MagicMock como uma versão estendida do Mock. Isso deve responder às suas perguntas sobre por que o Mock existe e o que o Mock fornece sobre o MagicMock.
Em segundo lugar, o MagicMock fornece implementações padrão de muitos / a maioria dos métodos mágicos, enquanto o Mock não. Veja aqui para mais informações sobre os métodos mágicos fornecidos.
Alguns exemplos de métodos mágicos fornecidos:
E estes que podem não ser tão intuitivos (pelo menos não intuitivos para mim):
Você pode "ver" os métodos adicionados ao MagicMock quando esses métodos são chamados pela primeira vez:
Então, por que não usar o MagicMock o tempo todo?
A pergunta de volta para você é: Você concorda com as implementações padrão do método mágico? Por exemplo, não há problema em
mocked_object[1]
não errar? Você concorda com quaisquer conseqüências não intencionais devido às implementações do método mágico já estarem lá?Se a resposta a essas perguntas for afirmativa, vá em frente e use o MagicMock. Caso contrário, atenha-se ao mock.
fonte
Isto é o que a documentação oficial do python diz:
fonte
Eu encontrei outro caso específico em que simples
Mock
pode se tornar mais útil do queMagicMock
:Comparar com
ANY
pode ser útil, por exemplo, comparar quase todas as chaves entre dois dicionários em que algum valor é calculado usando uma simulação.Isso será válido se você estiver usando
Mock
:enquanto aumentará um
AssertionError
se você usouMagicMock
fonte