เริ่มต้นด้วยMagicMock
คลาสย่อยของMock
.
class MagicMock(MagicMixin, Mock)
ด้วยเหตุนี้ MagicMock จึงมอบทุกสิ่งที่ Mock มอบให้และอีกมากมาย แทนที่จะคิดว่า Mock เป็นเวอร์ชันที่ถูกถอดออกของ MagicMock ให้นึกถึง MagicMock เป็นเวอร์ชันขยายของ Mock สิ่งนี้ควรตอบคำถามของคุณเกี่ยวกับสาเหตุที่ Mock มีอยู่และ Mock ให้อะไรกับ MagicMock
ประการที่สอง MagicMock นำเสนอการใช้งานตามค่าเริ่มต้นของวิธีการมายากลจำนวนมาก / ส่วนใหญ่ในขณะที่ Mock ไม่ทำ ดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการมายากลที่มีให้
ตัวอย่างบางส่วนของวิธีการมายากลที่มีให้:
>>> 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
และสิ่งเหล่านี้อาจไม่ใช้งานง่าย (อย่างน้อยก็ไม่ง่ายสำหรับฉัน):
>>> with MagicMock():
... print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>
คุณสามารถ "ดู" วิธีการที่เพิ่มลงใน MagicMock เมื่อมีการเรียกใช้วิธีการเหล่านั้นเป็นครั้งแรก:
>>> 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', ...]
ทำไมไม่ใช้ MagicMock ตลอดเวลา?
คำถามกลับมาหาคุณคือคุณโอเคกับการใช้เมธอดเริ่มต้นหรือไม่? เช่นmocked_object[1]
จะไม่ผิดพลาดหรือไม่? คุณโอเคกับผลลัพธ์ที่ไม่ได้ตั้งใจอันเนื่องมาจากการใช้เมธอดมายากลที่มีอยู่แล้วหรือไม่?
หากคำตอบสำหรับคำถามเหล่านี้คือใช่ให้ใช้ MagicMock ไม่งั้นติด Mock