2012-10-23 8 views
6

मैं App इंजन के NDB साथ DateTimeProperty के लिए एक फिल्टर का परीक्षण करने के कोशिश कर रहा हूँ लेकिन मैं इसे auto_now करने के लिए सेट है?ऐप इंजन एनडीबी में डेटटाइमप्रोपर्टी का परीक्षण कैसे करें?

वहाँ एक रास्ता इकाई परीक्षण के लिए इस के आसपास पाने के लिए है?

उदाहरण:

class MyModel(ndb.Model) 
    timestamp = ndb.DateTimeProperty(auto_now) 
    name = ndb.StringProperty() 


def testMyModelFilter(self): 
    test1 = MyModel() 
    test1.timestamp = datetime.datetime.now() - datetime.timedelta(hours=2) 
    test1.put() 
    test2 = MyModel() 
    test2.timestamp = datetime.datetime.now() - datetime.timedelta(hours=1) 
    test2.put() 

    hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1) 
    fetched = MyModel.query().filter(MyModel.timestamp < hour_ago).fetch(
     None, keys_only=True) 

दुर्भाग्य से, जब मैं test.put() के साथ डेटासंग्रह करने के लिए इसे प्रतिबद्ध है, यह समय का उपयोग करता है जब यह रखा गया था()।

+0

कुछ विचार: ओवरराइड '_pre_put_hook()' या सेट 'MyModel.timestamp' एक सामान्य' ndb.DateTimeProperty' करने के लिए आप एक परीक्षण में हैं। – mjibson

+0

मुख्य मुद्दा यह है कि क्योंकि यह एक अलग टाइमस्टैम्प रिकॉर्ड कर रहा है है, और आप एक तरीका है कि अपने फ़िल्टर काम करता है की पुष्टि है कि सही समय पर फिल्टर करने के लिए के लिए देख रहे हैं? दूसरे शब्दों में, क्या 'test.put() '' test_key' के परिणाम को असाइन करने के लिए पर्याप्त होगा, और फिर कुंजी का उपयोग कर इकाई प्राप्त करें? – RocketDonkey

+0

@RocketDonkey हाँ, मैं अपने फ़िल्टर को सत्यापित करने के लिए देख रहा हूँ। मैंने लुकअप को शामिल करने के लिए अपना उदाहरण विस्तारित किया है। – wag2639

उत्तर

9

तो एक बात है (जैसा कि @mjibson द्वारा उल्लेख) तुम कोशिश कर सकते परीक्षण के दौरान अपने मॉडल अधिभावी है। चूंकि MyModel ही एक वस्तु है, तो आप अपने परीक्षण के लिए गलत पर timestamp की _auto_now संपत्ति संशोधित कर सकते हैं। उदाहरण के लिए:

def testMyModelFilter(self): 
    # Change the auto_now parameter to False 
    MyModel.timestamp._auto_now = False 

    # Test as usual... 
    test1 = MyModel() 
    test1.timestamp = datetime.datetime.now() - datetime.timedelta(hours=2) 
    test1.put() 
    test2 = MyModel() 
    test2.timestamp = datetime.datetime.now() - datetime.timedelta(hours=1) 
    test2.put() 

    hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1) 
    fetched = MyModel.query().filter(MyModel.timestamp < hour_ago).fetch(
     None, keys_only=True) 

मैं कहीं और इस तकनीक को देखकर याद है, इसलिए यदि मैं इसे पा सकते हैं मैं लिंक कर देंगे (यदि यह :) निश्चित रूप से, काम करता है)।

+0

क्या मुझे dict का उपयोग करना है या क्या मैं पैरामीटर को ओवरराइड कर सकता हूं? MyModel.timestamp = ndb.DateTimeProperty (auto_now = झूठा) – wag2639

+0

@ wag2639 मैं गलत हो सकता हूं (और यह मेरे सोने के समय के करीब है, इसलिए मैं शायद हूं), लेकिन मुझे लगता है कि जिस तरह से मॉडल गुण कार्य करता है (जीएई मॉडल डिस्क्रिप्टर कक्षाओं का उपयोग करते हैं, जिनके पीछे उनकी खुद की विशिष्टताएं हैं)। हालांकि आप अब थोड़ा बेहतर संस्करण लाएंगे जो मैं अब पोस्ट करूंगा :) – RocketDonkey

+0

@ wag2639 अधिक विशेष रूप से, यदि आप 'dnd (myModel.timestamp) 'की तुलना करने से पहले' dnd (MyModel.timestamp)' की तुलना करने की कोशिश करते हैं, तो आपकी पिछली टिप्पणी, इसे असाइन करने के बाद मान पर, आप देखेंगे कि इसमें 'model_class' पैरामीटर गुम है, जहां आपका' MyModel' क्लास संदर्भ संग्रहीत है। – RocketDonkey

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