के साथ बेस क्लास का नकल कैसे करें I Python में कुछ यूनिट-टेस्ट लिखने के लिए mock
का उपयोग करने का प्रयास करें।पाइथन मॉक लाइब्रेरी
उदाहरण के लिए मैं निम्नलिखित वर्ग है:
class TCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
और मैं केवल handle
विधि का परीक्षण करना चाहते। socketserver.BaseRequestHandler
के बारे में कुछ भी मानने के बिना। उदाहरण के लिए मैं यह कहना चाहता हूं कि handle
recv
पर 1024
तर्क के साथ कॉल करना चाहता है। क्या नकली के साथ ऐसी चीज करना संभव है? अर्थात। एक वर्ग के साथ बेस क्लास socketserver.BaseRequestHandler
को बदल रहा है? या क्या मैं उस विचार से ट्रैक कर रहा हूं?
ecatmur के जवाब के साथ
(! धन्यवाद) मैं पहली बार करने की कोशिश की है:
patcher = patch.object(TCPHandler, '__bases__', (Mock,))
with patcher:
patcher.is_local = True
handler = TCPHandler()
handler.handle()
लेकिन अब handle
नहीं बुलाया जाता है anylonger और dir(handler)
देता है:
['assert_any_call', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec', 'mock_calls', 'reset_mock', 'return_value', 'side_effect']
type(handler)
देता है <class 'mock.TCPHandler'>
जो मैं समझता हूं कि बेस क्लास को पैच करने से मेरी व्युत्पन्न कक्षा भी नकली हो जाती है।
mock = MagicMock()
TCPHandler.handle(mock)
#assertions
हालांकि नकली नहीं लगता है के नाम से जाना:
मैं अब एक और विचार एक कोशिश दे दी है।
def test_derived():
patcher = mock.patch.object(Derived, '__bases__', (mock.Mock,))
with patcher:
patcher.is_local = True
d = Derived()
print d.foo()
is_local
हैक आवश्यक है जब पैच पीछे delattr
कॉल करने के लिए कोशिश कर रहा से mock.patch
को रोकने के लिए:
मैंने आपके संकेत का पालन किया लेकिन परिणाम यह था कि व्युत्पन्न वर्ग की विधि को नकली द्वारा प्रतिस्थापित किया गया है। –
यदि आपने कोई नज़र डाली है तो मैंने अपना वर्तमान टेस्ट कोड प्रश्न में रखा है? तुम्हारी सहायता सराहनीय है। –
@FrederickRoth भी यकीन नहीं है; यह पाइथन 2 के साथ मेरे लिए ठीक काम करता है। शायद उस ऑब्जेक्ट के हिस्सों को मजाक करने का प्रयास करें जो विधि तक पहुंचता है? – ecatmur