2012-10-23 51 views
6

我想用App Engine的NDB測試DateTimeProperty的過濾器,但我把它設置爲auto_now?如何測試App Engine NDB中的DateTimeProperty?

有沒有辦法解決這個單元測試?

例子:

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就足夠了,然後使用key來獲取實體? – RocketDonkey

+0

@RocketDonkey是的,我正在驗證我的過濾器。我已經擴展了我的示例以包含查找。 – wag2639

回答

9

因此,您可以嘗試一件事(如@mjibson所暗示的)在測試過程中覆蓋您的模型。由於MyModel本身就是一個對象,因此您可以將timestamp_auto_now屬性修改爲False以進行測試。例如:

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

我必須使用詞典還是可以覆蓋參數? MyModel.timestamp = ndb.DateTimeProperty(auto_now = False) – wag2639

+0

@ wag2639我可能是錯的(它臨近我的就寢時間,所以我可能是),但我認爲這會混淆模型屬性函數的方式(GAE模型使用描述符類,在它們背後有它們自己的特性)。但是你明白了一個稍微好一點的版本,我現在要發佈:) – RocketDonkey

+0

@ wag2639更具體地說,如果在嘗試重新分配'ndb.DateTimeProperty'之前比較'dir(MyModel.timestamp)''到你賦值後的值,你會發現它缺少'model_class'參數,這是你的'MyModel'類參考存儲的地方。 – RocketDonkey

相關問題