How to Clear/Invalidate NDB Cache in Tests

*爱你&永不变心* 提交于 2019-12-14 02:33:45

问题


I have a simple NDB Model with an instance attribute, which is not an NDB property. I want to test that the property value gets lost when the entity is saved and retrieved from the datastore.

Now when the entity is retrieved it is the same instance as the one that has been put to the datastore.

Is there a way to programatically clear/invalidate the memcache and the NDB in-memory cache?

The example is a pytest test, sorry for that.

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

回答1:


You're apparently using the wrong method to assign a value to retrieved_user. Use the following instead:

retrieved_user = user_key.delete(use_datastore=False)

See the following link for more information:

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




回答2:


The solution is to prevent an entity to be cached when it is being put to the DB with 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



回答3:


I had the same problem, and was searching for a solution. This does the trick:

ndb.get_context().clear_cache()


来源:https://stackoverflow.com/questions/22565725/how-to-clear-invalidate-ndb-cache-in-tests

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!