如何清除/无效NDB缓存测试(How to Clear/Invalidate NDB Cache i

2019-10-19 15:06发布

我有一个简单的NDB与实例属性,它是不是一个型号NDB财产 。 我想测试,当实体被保存并从数据库中检索到的属性值丢失。

现在,当实体被检索是相同的实例作为已经投入到数据存储的一个。

是否有明确的编程/无效的方式内存缓存和NDB内存中缓存

这个例子是一个pytest测试,抱歉这一点。

from google.appengine.ext import testbed, ndb


class User(ndb.Model):
    name = ndb.TextProperty()
    foo = None


class TestNDBModel(object):

    def setup(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()

    def teardown(self):
        self.testbed.deactivate()

    def test_foo(self):
        user = User(name='Andy')
        assert user.name == 'Andy'
        assert user.foo is None
        user.foo = 123
        assert user.foo == 123
        user_key = user.put()

        # Here I need to clear the cache somehow,
        # so that the entity must be retrieved from datastore

        retrieved_user = user_key.get()

        # These two will now fail
        assert retrieved_user is not user
        assert retrieved_user.foo is None

Answer 1:

你显然使用了错误的方法来分配一个值retrieved_user 。 改用以下内容:

retrieved_user = user_key.delete(use_datastore=False)

请参阅以下链接了解更多信息:

https://developers.google.com/appengine/docs/python/ndb/functions#context_options



Answer 2:

该解决方案是为了防止当它被放置到DB与被高速缓存的实体entity.put(use_cache=False, use_memcache=False)

from google.appengine.ext import testbed, ndb


class User(ndb.Model):
    name = ndb.TextProperty()
    foo = None


class TestNDBModel(object):

    def setup(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()

    def teardown(self):
        self.testbed.deactivate()

    def test_foo(self):
        user = User(name='Andy')
        assert user.name == 'Andy'
        assert user.foo is None
        user.foo = 123
        assert user.foo == 123

        # This prevents the entity to be cached
        user_key = user.put(use_cache=False, use_memcache=False)

        # The entity is now retrieved from DB
        retrieved_user = user_key.get()

        # These two will now pass
        assert retrieved_user is not user
        assert retrieved_user.foo is None


Answer 3:

我有同样的问题,并寻找解决的办法。 这确实的伎俩:

ndb.get_context().clear_cache()


文章来源: How to Clear/Invalidate NDB Cache in Tests