Başlangıç olarak, MagicMock
bir alt sınıfıdır Mock
.
class MagicMock(MagicMixin, Mock)
Sonuç olarak, MagicMock, Mock'un sağladığı her şeyi ve daha fazlasını sağlar. Mock'u MagicMock'un soyulmuş bir versiyonu olarak düşünmek yerine, MagicMock'u Mock'un genişletilmiş bir versiyonu olarak düşünün. Bu, Mock'un neden var olduğu ve Mock'in MagicMock'un üstünde ne sağladığı hakkında sorularınızı ele almalıdır.
İkincisi, MagicMock birçok / en sihirli yöntemin varsayılan uygulamalarını sağlarken Mock sunmaz. Sağlanan sihirli yöntemler hakkında daha fazla bilgi için buraya bakın .
Sağlanan sihirli yöntemlere bazı örnekler:
>>> 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
Ve bu kadar sezgisel olmayabilir (en azından benim için sezgisel değil):
>>> with MagicMock():
... print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>
Bu yöntemler ilk kez çağrıldığından MagicMock'a eklenen yöntemleri "görebilirsiniz":
>>> 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', ...]
Peki, neden MagicMock'u her zaman kullanmıyorsunuz?
Size geri dönecek olan soru şudur: Varsayılan sihirli yöntem uygulamalarında iyi misiniz? Örneğin, mocked_object[1]
hata yapmamak sorun değil mi? Sihirli yöntem uygulamalarının zaten orada olması nedeniyle istenmeyen sonuçlarla karşılaşır mısınız?
Bu soruların cevabı evet ise, devam edin ve MagicMock'u kullanın. Aksi takdirde, Mock'a sadık kalın.