2013-04-19 7 views
7

मैं यह सुनिश्चित करना चाहता हूं कि datetime.datetime.now() परीक्षण उद्देश्यों के लिए एक विशिष्ट डेटाटाइम देता है, मैं यह कैसे कर सकता हूं? मैं pytest के monkeypatchबिन्दुइन फ़ंक्शन datetime.datetime.now बंदरपैच कैसे करें?

monkeypatch.setattr(datetime.datetime,"now", nowfunc) 

साथ की कोशिश की है लेकिन यह मुझे त्रुटि TypeError: can't set attributes of built-in/extension type 'datetime.datetime'

उत्तर

9

त्रुटि आपको बताता है के रूप में, आप कई विस्तार सी में लागू प्रकार की विशेषताओं monkeypatch नहीं कर सकते हैं (अन्य अजगर कार्यान्वयन CPython से अलग नियम होते हैं सकता है, लेकिन वे अक्सर इसी तरह के प्रतिबंध है।)

रास्ता इसके आसपास सबक्लास बनाना है, और कक्षा पर बंदरगाह बंद करें।

उदाहरण के लिए

(अपरीक्षित, क्योंकि मैं pytest आसान नहीं है ... लेकिन यह पुस्तिका monkeypatching साथ काम करता है):

class patched_datetime(datetime.datetime): pass 
monkeypatch.setattr(patched_datetime, "now", nowfunc) 
datetime.datetime = patched_datetime 
+0

एक अच्छी शुरुआत है कि है, लेकिन फिर आप यह भी सुनिश्चित है कि 'nowfunc' है बनाने की जरूरत है सही ढंग से बाध्य यहां py.test के लिए एक अच्छा पूर्ण समाधान है: http://stackoverflow.com/questions/20503373/how-to-monkeypatch-pythons-datetime-datetime-now-with-py-test –

1

आप नहीं कर सकते हैं देता है, त्रुटि से पता चलता है के रूप में। यदि आपको ऐसा करने की आवश्यकता है, तो आपको परीक्षण के तहत कोड को बदलने की आवश्यकता होगी ताकि उसके पास एक उपयोगिता फ़ंक्शन हो जो datetime.datetime.now() पर कॉल करे और इसके बजाय उस संदर्भ को इंगित करने के लिए सभी संदर्भों को बदलें। फिर, आप अपनी पसंद के समय को वापस करने के लिए उस फ़ंक्शन को बंद कर सकते हैं।

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