【问题标题】:GAE test to verify that ndb entity was **not** put in the datastoreGAE 测试以验证 ndb 实体**未**放入数据存储区
【发布时间】:2015-02-02 20:15:17
【问题描述】:

非常简单,我想运行一些代码并验证 没有实体 MyEntity(ndb.Model) 被放入数据存储区。

我尝试过MyEntity.query().fetch(keys_only=True),但这似乎不是高度一致的(即它没有显示我刚刚添加的一个实体),因此返回一个空列表并不是真正的确认。 (我应该补充一点,我正在使用testbed.init_datastore_v3_stub,我已经尝试过datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=1)MasterSlaveConsistencyPolicy(),但没有成功。)

我认为有一种方法可以对一种类型的所有键执行高度一致的“获取”,但现在我找不到任何文档来支持这一点。

我知道如果我有一个密钥,我可以进行强一致的获取,但是这将如何转化为验证实体是否添加,因此没有获取密钥?

【问题讨论】:

    标签: unit-testing google-app-engine google-cloud-datastore app-engine-ndb


    【解决方案1】:

    好吧,除了normal unit testing testbeds 之外,我终于通过disabling the ndb cache via global contextHow to Clear/Invalidate NDB Cache in Tests 提示)让它工作了。

    还得到了以下帮助:

    Helper Mixin:

    class NdbTestbedNoCachingStronglyConsistentMixin(unittest.TestCase):
        def setUp(self):
            self.testbed = testbed.Testbed()
            self.testbed.activate()
            policy = None
            # policy = datastore_stub_util.MasterSlaveConsistencyPolicy()
            # policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=1.0)
            self.testbed.init_datastore_v3_stub(consistency_policy=policy)
            # self.testbed.init_memcache_stub()
    
            # It's not enough (or necessary) to use stubs for datastore and memcache -
            # we also need to change ndb policy to ensure that datastore queries
            # are strongly-consistent
            cxt = ndb.get_context()
    
            def disallow(*args, **kwargs):
                return False
    
            cxt.set_cache_policy(disallow)
            cxt.set_memcache_policy(disallow)
            super(NdbTestbedNoCachingStronglyConsistentMixin, self).setUp()
    
        def tearDown(self):
            super(NdbTestbedNoCachingStronglyConsistentMixin, self).tearDown()
            self.testbed.deactivate()
    

    这样使用(省略了一些不相关的代码):

    def _get_entity_keys():
        return MyNdbEntity.query().fetch(keys_only=True)
    
    
    class TestMyEntity(NdbTestbedNoCachingStronglyConsistentMixin):
    
        def tearDown(self):
            super(TestMyEntity, self).tearDown()
    
            # Verify our assumptions that no entities persist between tests
            assert MyNdbEntity.get_by_identifier(self.account, TEST_IDENTIFIER) is None
            assert not _get_entity_keys()
    
        def test_get_uri_should_retrieve_existing_entity(self):
            provider.get_uri(TEST_IDENTIFIER)  # creates entity
            all_assets_keys = _get_entity_keys()
            created_asset = MyNdbEntity.get_by_identifier(self.account, TEST_IDENTIFIER)
    
            self.assertIn(created_asset.key, all_assets_keys)
    
            provider.get_uri(TEST_IDENTIFIER)
            all_assets_keys_after_get = _get_entity_keys()
    
            self.assertSequenceEqual(all_assets_keys_after_get, all_assets_keys)
    
    
        def test_get_uri_should_create_entity_and_prefix_identifier_with_security_id(self):
            expected_identifier = TEST_SECURITY_ID + '-' + TEST_IDENTIFIER
            expected_uri = VIEWER_IMAGE_BASE_URI % expected_identifier
    
            uri = provider.get_uri(TEST_IDENTIFIER)
            image = _get_entity_keys()[0].get()
    
            self.assertEqual(image.identifier, expected_identifier)
            self.assertEqual(uri, expected_uri)
    

    【讨论】:

    • 这是“正确”的方式吗,@guido-van-rossum?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2012-07-15
    相关资源
    最近更新 更多