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