2012-12-26 5 views
5

के साथ मॉकिंग मैं मॉकिंग और सर्वोत्तम खोज के लिए विभिन्न टूल्स का उपयोग करने की कोशिश कर रहा हूं। मुझे वास्तव में इसकी सादगी के लिए फ्लेक्समॉक पसंद है, लेकिन मैं यह नहीं समझ सकता कि datetime.datetime.now() के व्यवहार का नकल कैसे करें।फ्लेक्समॉक datetime.datetime.now

flexmock में निम्नलिखित व्यवहार का नकल कैसे करें?

>>> from datetime import datetime 
>>> mocker = Mocker() 
>>> fake_datetime=mocker.replace(datetime) 
>>> fake_datetime.now() 
<mocker.Mock object at 0x027F1990> 
>>> mocker.result(datetime(year=2012, month=12, day=12)) 
>>> mocker.replay() 
>>> datetime.now() 
datetime.datetime(2012, 12, 12, 0, 0) 

जब मैं flexmock में एक ही कोशिश:

>>> from datetime import datetime 
>>> fake_datetime = flexmock(datetime) 
Traceback (most recent call last): 
    File "C:\virtualenvs\webui\lib\site-packages\flexmock.py", line 1194, in flexmock 
    return _create_partial_mock(spec, **kwargs) 
    File "C:\virtualenvs\webui\lib\site-packages\flexmock.py", line 1013, in 
_create_partial_mock 
if (_attach_flexmock_methods(mock, Mock, obj_or_class) and 
    File "C:\virtualenvs\webui\lib\site-packages\flexmock.py", line 1030, in 
_attach_flexmock_methods 
'Python does not allow you to mock builtin objects or modules. ' 
    'Python does not allow you to mock builtin objects or modules. ' 
MockBuiltinError: Python does not allow you to mock builtin objects or modules. 
Consider wrapping it in a class you can mock instead 

या

>>>flexmock(datetime).should_receive('datetime.now').and_return(datetime.datetime(2012,12,10)) 
>>> datetime.datetime.now() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'function' object has no attribute 'now' 

उत्तर

4

आपका पहला दृष्टिकोण सही विचार था लेकिन दुर्भाग्य से अजगर आप datetime.datetime तरह निर्मित वस्तुओं को संशोधित नहीं करता है । फ्लेक्समॉक बंदर-ऑब्जेक्ट और हाइजैक विधि को रनटाइम पर कॉल करता है जो इस मामले में संभव नहीं है। अपवाद में त्रुटि वास्तव में एक समाधान का उल्लेख करती है - आप अपनी खुद की कक्षा में datetime.datetime लपेट सकते हैं और फिर उस पर नकल कर सकते हैं। लेकिन अगर आप वास्तव में अभी() विधि देता है कि आप क्या चाहते हैं एक साथ एक नकली वस्तु बनाने के क्या ठट्ठा अपने उदाहरण में किया था क्या करना चाहते हैं और, आप ऐसा कर सकते बहुत आसानी से:

fake_datetime = flexmock(now=lambda: datetime(year=2012, month=12, day=12)) 

लेकिन, ज़ाहिर है, डेटाटाइम पर नियमित कॉल .now() को फ्लेक्समॉक द्वारा अपहृत नहीं किया जाएगा जबतक कि आप नकली डेटाटाइम ऑब्जेक्ट को कॉलिंग कोड में इंजेक्शन नहीं दे रहे थे।

आपके दूसरे दृष्टिकोण ने एक त्रुटि उत्पन्न की क्योंकि फ्लेक्समॉक में डेटाटाइम। Should_receive ('datetime.now') जंजीर विधि कॉल के लिए है। जिसका अर्थ है कि यह datetime.datetime()।() के बजाय datetime.datetime()।() की तरह कॉल की अपेक्षा करता है, इसलिए यह डेटाटाइम के बारे में शिकायत करता है, जो कि अब एक विधि होने की अपेक्षा करता है()।

संबंधित मुद्दे