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
You're apparently using the wrong method to assign a value to
retrieved_user
. Use the following instead:See the following link for more information:
https://developers.google.com/appengine/docs/python/ndb/functions#context_options
I had the same problem, and was searching for a solution. This does the trick:
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)
.