簡體   English   中英

如何在測試中清除/無效NDB緩存

[英]How to Clear/Invalidate NDB Cache in Tests

我有一個帶有實例屬性的簡單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

您顯然使用錯誤的方法為retrieved_user分配值。 請改用以下內容:

retrieved_user = user_key.delete(use_datastore=False)

有關更多信息,請參閱以下鏈接:

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

解決方案是防止實體在使用entity.put(use_cache=False, use_memcache=False)放入DB時進行緩存。

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

我有同樣的問題,正在尋找解決方案。 這樣做的訣竅:

ndb.get_context().clear_cache()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM