संपादित: https://pypi.python.org/pypi/freezegun: चूंकि मेरा उत्तर स्वीकार किए जाते हैं जवाब यहाँ मैं इसे अद्यतन करने कर रहा हूँ सबको पता एक बेहतर तरीका इस बीच, freezegun पुस्तकालय में बनाया गया है यह बताने के लिए है। जब मैं परीक्षण में समय को प्रभावित करना चाहता हूं तो मैं अपनी सभी परियोजनाओं में इसका उपयोग करता हूं। इस पर एक नज़र डालो।
मूल जवाब:
इस तरह आंतरिक सामान की जगह यह बुरा दुष्प्रभाव हो सकते हैं क्योंकि हमेशा खतरनाक है। तो आप वास्तव में क्या चाहते हैं, बंदर पैचिंग जितना संभव हो उतना स्थानीय हो।
हम माइकल Foord उत्तम नकली पुस्तकालय का उपयोग करें: http://www.voidspace.org.uk/python/mock/ एक @patch
डेकोरेटर जो कुछ कार्यक्षमता पैच है, लेकिन बंदर पैच केवल परीक्षण समारोह के दायरे में रहता है, और समारोह इसके दायरे से बाहर चलाता है के बाद सब कुछ स्वचालित रूप से पुनर्स्थापित किया जाता है ।
एकमात्र समस्या यह है कि आंतरिक datetime
मॉड्यूल सी में लागू किया गया है, इसलिए डिफ़ॉल्ट रूप से आप इसे बंदर बंदर करने में सक्षम नहीं होंगे। हमने अपना खुद का सरल कार्यान्वयन करके इसे ठीक किया है जो मजाक कर सकता है।
कुल समाधान इस तरह कुछ है (उदाहरण एक डीजेगो प्रोजेक्ट के भीतर उपयोग किया जाने वाला एक सत्यापनकर्ता फ़ंक्शन है जो यह सत्यापित करने के लिए कि भविष्य में एक तिथि है)। आपको लगता है कि मैंने इसे एक प्रोजेक्ट से लिया है, लेकिन गैर-महत्वपूर्ण चीजें ली हैं, इसलिए चीजें वास्तव में काम नहीं कर सकती हैं, लेकिन आपको यह विचार मिल रहा है, लेकिन मुझे आशा है, मुझे उम्मीद है :)
सबसे पहले हम अपने स्वयं के बहुत सरल को परिभाषित करते हैं
import datetime
def today():
return datetime.date.today()
फिर हम tests.py
में इस सत्यापनकर्ता के लिए unittest बनाने: एक फ़ाइल में datetime.date.today
के कार्यान्वयन utils/date.py
बुलाया
import datetime
import mock
from unittest2 import TestCase
from django.core.exceptions import ValidationError
from .. import validators
class ValidationTests(TestCase):
@mock.patch('utils.date.today')
def test_validate_future_date(self, today_mock):
# Pin python's today to returning the same date
# always so we can actually keep on unit testing in the future :)
today_mock.return_value = datetime.date(2010, 1, 1)
# A future date should work
validators.validate_future_date(datetime.date(2010, 1, 2))
# The mocked today's date should fail
with self.assertRaises(ValidationError) as e:
validators.validate_future_date(datetime.date(2010, 1, 1))
self.assertEquals([u'Date should be in the future.'], e.exception.messages)
# Date in the past should also fail
with self.assertRaises(ValidationError) as e:
validators.validate_future_date(datetime.date(2009, 12, 31))
self.assertEquals([u'Date should be in the future.'], e.exception.messages)
अंतिम कार्यान्वयन इस तरह दिखता है:
012,
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ValidationError
from utils import date
def validate_future_date(value):
if value <= date.today():
raise ValidationError(_('Date should be in the future.'))
आशा इस
यह वास्तव में सही तरीका है। यह नकली लाइब्रेरी शानदार है। – hendrixski
मैंने एक वैकल्पिक विधि ब्लॉग किया डेटाटाइम के साथ नकली/पैच का उपयोग करने के लिए: http: //www.voidspace.org.uk/python/weblog/arch_d7_2010_10_02.shtml#e1188 – fuzzyman