class HelloWorld(object):
def say_it(self):
return 'Hello I am Hello World'
def i_call_hello_world(hw_obj):
print 'here... check type: %s' %type(HelloWorld)
if isinstance(hw_obj, HelloWorld):
print hw_obj.say_it()
from mock import patch, MagicMock
import unittest
class TestInstance(unittest.TestCase):
@patch('__main__.HelloWorld', spec=HelloWorld)
def test_mock(self,MK):
print type(MK)
MK.say_it.return_value = 'I am fake'
v = i_call_hello_world(MK)
print v
if __name__ == '__main__':
c = HelloWorld()
i_call_hello_world(c)
print isinstance(c, HelloWorld)
unittest.main()
मजाक ट्रैस बैकisinstance और यहाँ
here... check type: <type 'type'>
Hello I am Hello World
True
<class 'mock.MagicMock'>
here... check type: <class 'mock.MagicMock'>
E
======================================================================
ERROR: test_mock (__main__.TestInstance)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1224, in patched
return func(*args, **keywargs)
File "t.py", line 18, in test_mock
v = i_call_hello_world(MK)
File "t.py", line 7, in i_call_hello_world
if isinstance(hw_obj, HelloWorld):
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
----------------------------------------------------------------------
Ran 1 test in 0.002s
Q1 है। यह त्रुटि क्यों फेंक दी गई है? वे <class type='MagicMock>
Q2 हैं। मैं मॉकिंग को कैसे रोकूं ताकि त्रुटि ठीक हो जाने पर पहली पंक्ति गुजर जाएगी?
से आम तौर पर वर्ग एक वस्तु की विशेषता अपने प्रकार वापस आ जाएगी। एक spec वर्ग के साथ एक नकली वस्तु के लिए स्पेक वर्ग बदले में देता है।/के रूप में मुखौटा धारण कर लिया यह नकली वस्तुओं वस्तु वे स्थान ले रही हैं के लिए isinstance परीक्षण पास करने की अनुमति देता है:
mock = Mock(spec=3)
isinstance(mock, int)
True
धन्यवाद
अब आप जानते हैं कि 'isinstance' का उपयोग क्यों निराश है। –
@MarkRansom हाँ यह बुरा है। लेकिन यह सुनिश्चित करने के लिए सबसे अच्छा अभ्यास क्या है कि हम जिस इंटरफ़ेस में पास करते हैं वह सही है? 'हैट्टर' या तो अंतर को हल करने के लिए प्रतीत नहीं होता है। दो ऑब्जेक्ट्स में एक ही विधि के नाम हो सकते हैं और गलत ऑब्जेक्ट का उपयोग टेस्ट पास करेगा, मुझे लगता है? मुझे लगता है कि सवाल का ध्यान बदल गया है! आह। – CppLearner
यह बात है - पायथन के बारे में कई अच्छी चीजों में से एक यह है कि यह "बतख टाइपिंग" की अनुमति देता है जहां आप किसी ऑब्जेक्ट के सटीक प्रकार की परवाह नहीं करते हैं जब तक कि आप जो चाहते हैं वह करता है। आपको यह सुनिश्चित करने के लिए विधि नामकरण में कुछ सावधानी बरतनी पड़ सकती है कि आप एक ही नाम को दो अलग-अलग अर्थों से परिभाषित नहीं करते हैं, लेकिन यह अंत में कोड को बहुत लचीलापन लाता है। यह एक सुविधा है, एक बग नहीं। –