如何使用unittest来捕获CapabilityDisabledError异常?

时间:2014-04-11 05:13:30

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

我在GAE上有一个Flask项目,我想开始在数据存储有问题的情况下在数据库写入时添加try / except块,当出现真正的错误时肯定会触发,但是我&# 39;我想在单位测试中模仿这个错误,这样我就可以确信在停电期间会发生什么。

例如,我的User模型:

class User(ndb.Model):
    guser = ndb.UserProperty()
    user_handle = ndb.StringProperty()

以及其他视图/控制器代码:

def do_something():
    try:
        User(guser=users.get_current_user(), user_handle='barney').put()
    except CapabilityDisabledError:
        flash('Oops, database is down, try again later', 'danger')
    return redirect(url_for('registration_done'))

以下是我的测试代码的要点:https://gist.github.com/iandouglas/10441406

简而言之,GAE允许我们使用功能暂时禁用memcache,datastore_v3等的存根,以及主要的测试方法:

def test_stuff(self):
    # this test ALWAYS passes, making me believe the datastore is temporarily down
    self.assertFalse(capabilities.CapabilitySet('datastore_v3').is_enabled())

    # but this write to the datastore always SUCCEEDS, so the exception never gets
    # thrown, therefore this "assertRaises" always fails
    self.assertRaises(CapabilityDisabledError,
        lambda: User(guser=self.guser, pilot_handle='foo').put())

我读了一些其他帖子,建议将User.put()调用为lambda,从而导致此回溯:

Traceback (most recent call last):
  File "/home/id/src/project/tests/integration/views/test_datastore_offline.py", line 28, in test_stuff
    self.assertRaises(CapabilityDisabledError, lambda: User(
AssertionError: CapabilityDisabledError not raised

如果我删除lambda:部分,我会改为追溯:

Traceback (most recent call last):
  File "/home/id/src/project/tests/integration/views/test_datastore_offline.py", line 31, in test_stuff
    pilot_handle_lower='foo'
  File "/usr/lib/python2.7/unittest/case.py", line 475, in assertRaises
    callableObj(*args, **kwargs)
TypeError: 'Key' object is not callable

Google的教程向您展示了如何为单元测试打开和关闭这些功能,而在其他教程中,他们会向您展示如果他们的服务处于脱机状态或遇到间歇性问题会引发哪些异常,但他们没有教程展示他们如何在单元测试中一起工作。

感谢任何想法。

1 个答案:

答案 0 :(得分:1)

数据存储存根不支持返回CapabilityDisabledError,因此启用功能存根中的错误不会影响对数据存储的调用。

另外,如果您使用的是High Replication数据存储区,那么您将永远不会遇到CapabilityDisabledError,因为it does not have scheduled downtime