2012-10-23 14 views
6

Sto provando a testare un filtro per DateTimeProperty con NDB di App Engine ma l'ho impostato su auto_now?Come testare DateTimeProperty in App Engine NDB?

C'è un modo per aggirare questo per il test dell'unità?

Esempio:

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) 

Purtroppo, quando ho commesso al datastore con test.put(), utilizza il tempo in cui è stato messo().

+0

Alcune idee: sovrascrive '_pre_put_hook()' o imposta 'MyModel.timestamp' su un normale' ndb.DateTimeProperty' se sei in una prova. – mjibson

+0

Il problema principale è che, poiché sta registrando un diverso timestamp, e stai cercando un modo per filtrare in quel momento esatto per verificare che il filtro funzioni? In altre parole, sarebbe sufficiente assegnare il risultato di 'test.put()' a 'test_key', e quindi ottenere l'entità usando la chiave? – RocketDonkey

+0

@RocketDonkey sì, sto cercando di verificare il mio filtro. Ho ampliato il mio esempio per includere la ricerca. – wag2639

risposta

9

Quindi una cosa che si può provare (come accennato da @mjibson) sta sovrascrivendo il modello durante il test. Poiché lo stesso MyModel è un oggetto, è possibile modificare la proprietà su timestamp su False per il test. Per esempio:

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) 

Ricordo di aver visto questa tecnica da qualche altra parte, quindi mi collego se riesco a trovarlo (se funziona, ovviamente :)).

+0

Devo usare dict o posso sovrascrivere il parametro? MyModel.timestamp = ndb.DateTimeProperty (auto_now = False) – wag2639

+0

@ wag2639 Potrei sbagliarmi (e si avvicina alla mia ora di andare a letto, quindi probabilmente lo sono), ma penso che possa rovinare il modo in cui funzionano le proprietà del modello (I modelli GAE usano classi descrittive, che hanno le loro peculiarità dietro di loro). Comunque hai portato alla luce una versione leggermente migliore che posterò ora :) – RocketDonkey

+0

@ wag2639 Più specificamente, se confronti 'dir (MyModel.timestamp)' prima di provare a riassegnare 'ndb.DateTimeProperty' a la tua precedente osservazione, al valore dopo averlo assegnato, vedrai che manca il parametro 'model_class', che è il punto in cui è memorizzato il riferimento di classe' MyModel'. – RocketDonkey

Problemi correlati