如何从数据存储区刷新 NDB 实体?

How do I refresh an NDB entity from the datastore?

我希望能够在测试中断言我的代码为已修改的实体调用了 Model.put()。不幸的是,似乎正在进行一些缓存,例如这段代码:

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

通过此测试:

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

当我真的希望它没有时,因为在现实世界中,update_entity 实际上不会更改数据存储区中的任何内容。

使用鼻子,datastore_v3_stub,memcache_stub。

您当前的测试验证 "local" 实体的内存版本(独立于数据存储中的内容)。您应该在检查之前从 NDB 重新获取实体:

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

你可以像这样绕过缓存:

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

这些选项来自 ndb 的 context options。它们也可以应用于 Model.get_by_id()Model.query().fetch()Model.query().get()