कुछ समस्याएं हैं।
सबसे पहले, जिस तरह से आप उपयोग कर रहे हैं mock.patch
वह बिल्कुल सही नहीं है। जब एक डेकोरेटर के रूप में इस्तेमाल किया, यह देखते हुए समारोह / वर्ग (इस मामले में, बदल देता है datetime.date.today
) एक साथ Mock
वस्तु केवल सजाया समारोह के भीतर । तो, केवल भीतर अपने today()
जाएगा datetime.date.today
एक अलग समारोह है, जो तुम क्या चाहते हो करने के लिए प्रकट नहीं होता हो।
क्या आप वास्तव में चाहते हैं कि इस तरह से अधिक हो सकता है:
@mock.patch('datetime.date.today')
def test():
datetime.date.today.return_value = date(2010, 1, 1)
print datetime.date.today()
दुर्भाग्य से, यह काम नहीं करेगा:
>>> test()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.macosx-10.6-universal/egg/mock.py", line 557, in patched
File "build/bdist.macosx-10.6-universal/egg/mock.py", line 620, in __enter__
TypeError: can't set attributes of built-in/extension type 'datetime.date'
यह विफल हो जाता है क्योंकि पायथन में निर्मित प्रकार अपरिवर्तनीय हैं - अधिक विवरण के लिए इस उत्तर को देखें।
इस मामले में, मैं खुद को डेटाटाइम से हटा दूंगा और सही फ़ंक्शन बनाऊंगा:
import datetime
class NewDate(datetime.date):
@classmethod
def today(cls):
return cls(2010, 1, 1)
datetime.date = NewDate
और अब आप कर सकते हैं:
>>> datetime.date.today()
NewDate(2010, 1, 1)
mock
लाइब्रेरी के डॉक्स : voidspace.org.uk/python/mock/examples.html#partial-mocking