का उपयोग करके समय जमे हुए नहीं लगता है, मैं यह जांचने के लिए एक कार्यात्मक परीक्षण लिख रहा हूं कि मेरा एपीआई थ्रॉटलिंग अपेक्षित रूप से काम कर रहा है (हर महीने की शुरुआत में आराम होगा)।django परीक्षण में समय की समस्या का मज़ाक उड़ाते हुए: फ्रीजगुन
परीक्षण वर्ग:
class ApiThrottlingTest(ThrottlingBaseTest):
def test_throttling_purchaser_case(self):
now = datetime.datetime(year=2015, month=1, day=10, hour=6, minute=6, second=3)
last_day_of_current_month = datetime.datetime(year=2015, month=1, day=31, hour=23, minute=59, second=59)
first_day_of_next_month = datetime.datetime(year=2015, month=2, day=1, hour=0, minute=0, second=0)
with freeze_time(now) as frozen_datetime:
for i in xrange(3):
resp = self._project_details_request()
self.assertEqual(resp.status_code, 200)
resp = self._project_details_request()
self.assertEqual(resp.status_code, 429)
frozen_datetime.move_to(last_day_of_current_month)
resp = self._project_details_request()
# the test fails at this level
self.assertEqual(resp.status_code, 429)
frozen_datetime.move_to(first_day_of_next_month)
resp = self._project_details_request()
self.assertEqual(resp.status_code, 200)
परीक्षण काम करता है ठीक है, तो: last_day_of_current_month = datetime.datetime(... second=0)
लेकिन अगर असफल हो जायेगी: last_day_of_current_month = datetime.datetime(... second=59)
डिबगिंग के बाद यह DjangoRestFramework throttling.UserRateThrottle
में इस्तेमाल time
मॉड्यूल की तरह लगता है किसी भी तरह से एक मूल्य दे रहा है जो हमेशा मेरे परीक्षण में फ्रोजन समय से आगे है, जो सीए है कुछ सेकंड के एक सटीक मुद्दे का उपयोग कर।
पर FreezeGun Doctime.time()
आधार पर भी जमे हुए किया जाना चाहिए:
Once the decorator or context manager have been invoked, all calls to datetime.datetime.now(), datetime.datetime.utcnow(), datetime.date.today(), time.time(), time.localtime(), time.gmtime(), and time.strftime() will return the time that has been frozen.
लेकिन यह im की तरह लग रहा मेरे मामले time.time
सही ढंग से मज़ाक उड़ाया datetime के शुरू होने से समय लगता है लेकिन फिर वह समय की उम्मीद नहीं है साथ बदलते रहते हैं, यह उम्मीद है समय तक मैन्युअल रूप से अग्रेषित होने तक जमे हुए होने के लिए।
मैंने time.time
UserRateThrottle
में mock
मॉड्यूल का उपयोग करके अलग-अलग उपयोग करने की कोशिश की लेकिन अभी भी इस मुद्दे को हल नहीं किया।
----> कोई विचार क्या मुद्दा हो सकता है, और संभवतः कैसे हल किया जा सकता है?
टेस्ट विफल: (के बाद समय महीने के अंतिम दिन को भेजा जाता है: लाइन 14)
self.assertEqual(resp.status_code, 429)
AssertionError: 200 != 429
डीआरएफ वर्ग स्रोत कोड:
class SimpleRateThrottle(BaseThrottle):
...
cache = default_cache
timer = time.time
cache_format = 'throttle_%(scope)s_%(ident)s'
def __init__(self):
....
def allow_request(self, request, view):
...
self.now = self.timer() # here timer() returns unexpected value in test
....
मैं फ्रीजगुन के साथ इसे कैसे ओवरराइड कर सकता हूं !? असल में मैंने इसके बारे में सोचा और पाइथन 'मॉक' मॉड्यूल का उपयोग करके बंदर पैचिंग का उपयोग करके 'सरलरेट थ्रॉटल' द्वारा उपयोग किए गए मॉड्यूल 'फ़ंक्शन' के लौटे मूल्य का नकल करने की कोशिश की लेकिन अभी भी वही समस्या है !!! – DhiaTN
क्षमा करें, एहसास हुआ कि मैंने अपना जवाब लिखा था। अब यह कैसे किया जाता है के साथ संपादित किया गया है। – Linovia
धन्यवाद, लेकिन अभी भी एक ही समस्या है। – DhiaTN