Pertama-tama, MagicMock
adalah subkelas dari Mock
.
class MagicMock(MagicMixin, Mock)
Hasilnya, MagicMock menyediakan semua yang disediakan Mock dan banyak lagi. Daripada memikirkan Mock sebagai versi MagicMock yang dipreteli, pikirkan MagicMock sebagai versi tambahan dari Mock. Ini harus menjawab pertanyaan Anda tentang mengapa Mock ada dan apa yang disediakan Mock di atas MagicMock.
Kedua, MagicMock menyediakan implementasi default dari banyak / sebagian besar metode sulap, sedangkan Mock tidak. Lihat di sini untuk informasi lebih lanjut tentang metode ajaib yang disediakan.
Beberapa contoh metode sulap yang disediakan:
>>> 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
Dan ini yang mungkin tidak intuitif (setidaknya tidak intuitif bagi saya):
>>> with MagicMock():
... print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>
Anda dapat "melihat" metode yang ditambahkan ke MagicMock saat metode tersebut dipanggil untuk pertama kalinya:
>>> 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', ...]
Jadi, mengapa tidak menggunakan MagicMock setiap saat?
Pertanyaan kembali kepada Anda adalah: Apakah Anda setuju dengan penerapan metode ajaib default? Misalnya, apakah boleh untuk mocked_object[1]
tidak melakukan kesalahan? Apakah Anda baik-baik saja dengan konsekuensi yang tidak diinginkan karena penerapan metode sihir sudah ada?
Jika jawaban atas pertanyaan ini adalah ya, lanjutkan dan gunakan MagicMock. Jika tidak, tetap gunakan Mock.