1

Ich möchte in der Lage sein, in Tests zu behaupten, dass mein Code Model.put() für die Entitäten, die geändert wurden, aufgerufen wurde. Leider scheint es einige Caching los, so dass dieser Code zu:Wie aktualisiere ich eine NDB-Entität aus dem Datenspeicher?

from google.appengine.ext import ndb 

class MyModel(ndb.Model): 
    name = StringProperty(indexed=True) 
    text = StringProperty() 

def update_entity(id, text): 
    entity = MyModel.get_by_id(id) 
    entity.text = text 
    # This is where entity.put() should happen but doesn't 

diesen Test:

def test_updates_entity_in_datastore(unittest.TestCase): 
    name = 'Beartato' 
    entity = MyModel(id=12345L, name=name, text=None) 
    text = 'foo bar baz' 
    update_entity(entity.key.id(), text) 
    new_entity = entity.key.get() # Doesn't do anything, apparently 
    # new_entity = entity.query(MyModel.name == name).fetch()[0] # Same 
    assert new_entity.text == text 

Wenn ich würde wirklich lieber es nicht, da in der realen Welt, update_entity wird tatsächlich nichts im Datenspeicher ändern.

Verwenden von Nose, datastore_v3_stub und memcache_stub.

Antwort

4

Sie umgehen das Caching wie folgt aus:: Sie sollten die Einheit von NDB, bevor Sie überprüft erneut abzurufen

entity = key.get(use_cache=False, use_memcache=False)

Diese Optionen sind von NDB context options. Sie können auf Model.get_by_id(), Model.query().fetch() und Model.query().get() auch

0

Ihr aktueller Test validiert die "lokale" In-Memory-Version Ihrer Entität (unabhängig davon, was sich im Datenspeicher befindet).

new_entity = entity.key.get() 
assert [...] 
+0

Bearbeitet die Frage zu klären - versucht, dass es nichts ändert. – brandones

+0

Ich denke, es könnte sein, weil Sie explizit eine ID festlegen und der Stub irgendwie die Entität in den Cache versetzt? Wenn Sie die ID nicht festlegen, sollte der Schlüssel Keine sein. – Nabla