2017-02-01 18 views
5

का उपयोग करके समय जमे हुए नहीं लगता है, मैं यह जांचने के लिए एक कार्यात्मक परीक्षण लिख रहा हूं कि मेरा एपीआई थ्रॉटलिंग अपेक्षित रूप से काम कर रहा है (हर महीने की शुरुआत में आराम होगा)।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.timeUserRateThrottle में 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 
     .... 

उत्तर

0

आपको फ्रीज जी के साथ SimpleRateThrottle के टाइमर को ओवरराइड करने की आवश्यकता होगी अन समय का समय।

यहां क्या हो रहा है यह है कि फीज़ेन संभवतः पाइथन के समय मॉड्यूल को ओवरराइड करता है। हालांकि, SimpleRateThrottle मॉड्यूल का उपयोग नहीं करता है, यह मॉड्यूल के फ़ंक्शन का उपयोग करता है जो फ्रीज बंदूक की पहुंच से बाहर हो जाता है।

SimpleRateThrottle इसलिए पाइथन मानक लाइब्रेरी समय मॉड्यूल का उपयोग करता है जबकि कोड के दूसरे भाग फ्रीजगुन का उपयोग करते हैं।

संपादित करें: आप क्या करना चाहिए - के बाद FreezeGun सक्रिय हो गया है:

former_timer = SimpleRateThrottle.timer 
SimpleRateThrottle.timer = time.time 

और एक बार अपने परीक्षण खत्म हो गया है (टियरडाउन या जो कुछ भी बराबर में):

SimpleRateThrottle.timer = former_timer 

ध्यान दें कि आप कर सकते थे आपके लिए इसे संभालने के लिए एक बंदर पैचिंग lib का भी उपयोग करें।

+0

मैं फ्रीजगुन के साथ इसे कैसे ओवरराइड कर सकता हूं !? असल में मैंने इसके बारे में सोचा और पाइथन 'मॉक' मॉड्यूल का उपयोग करके बंदर पैचिंग का उपयोग करके 'सरलरेट थ्रॉटल' द्वारा उपयोग किए गए मॉड्यूल 'फ़ंक्शन' के लौटे मूल्य का नकल करने की कोशिश की लेकिन अभी भी वही समस्या है !!! – DhiaTN

+1

क्षमा करें, एहसास हुआ कि मैंने अपना जवाब लिखा था। अब यह कैसे किया जाता है के साथ संपादित किया गया है। – Linovia

+0

धन्यवाद, लेकिन अभी भी एक ही समस्या है। – DhiaTN

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

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