के साथ शुरू करने के लिए, MagicMock
एक उपवर्ग है Mock
।
class MagicMock(MagicMixin, 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'>
मैजिकमॉक में जोड़े गए तरीकों को आप "देख" सकते हैं क्योंकि वे तरीके पहली बार लागू किए गए हैं:
>>> 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', ...]
तो, हर समय मैजिकमॉक का उपयोग क्यों न करें?
आपके लिए सवाल यह है: क्या आप डिफ़ॉल्ट मैजिक पद्धति के कार्यान्वयन के साथ ठीक हैं? उदाहरण के लिए, क्या mocked_object[1]
त्रुटि नहीं करना ठीक है ? क्या जादू पद्धति लागू होने के कारण आप पहले से ही किसी अनपेक्षित परिणाम के साथ ठीक हैं?
यदि इन सवालों का जवाब हाँ है, तो आगे बढ़ें और मैजिकमॉक का उपयोग करें। अन्यथा, मॉक से चिपके रहें।