如何在gae中传递/模拟admin_required装饰器?

时间:2015-02-03 00:17:13

标签: python unit-testing google-app-engine mocking flask-restful

class Generator(Resource):

    @admin_required
    def get(self):
       pass

如果我在视图中添加@admin_required装饰器,则单元测试开始失败,并显示以下消息:

  

RuntimeError:在请求上下文之外工作

有没有办法模拟它或绕过它进行单元测试?

这是装饰者:

def admin_required(func):
    """Requires App Engine admin credentials"""
    @wraps(func)
    def decorated_view(*args, **kwargs):
        if users.get_current_user():
            if not users.is_current_user_admin():
                abort(401)  # Unauthorized
            return func(*args, **kwargs)
        return redirect(users.create_login_url(request.url))
    return decorated_view

1 个答案:

答案 0 :(得分:3)

我只是修改用户模块:

from google.appengine.api import users

# ...

@mock.patch.object(users, 'get_current_user')
@mock.patch.object(users, 'is_current_user_admin', return_value=True)
def test_handler(mock_get_current_user, mock_is_current_user_admin):
    invoke_your_handler()
    # make assertions, etc.

如果你想深入一点,你可以使用那个GAE测试平台...不幸的是,这里的文档看起来很糟糕而且难以正确...基于this answer,看起来你需要创建一个测试平台实例,然后设置环境:

from google.appengine.ext import testbed

testbed = testbed.TestBed()
testbed.activate()
testbed.init_user_stub()
# Sets environment variables...
testbed.setup_env(
    user_email='hello@gmail.com',
    user_id='123456',
    user_is_admin='1',  # '1' is an admin, '0' is a non-admin.
    overwrite=True,
)

现在像往常一样继续你的考试。如果您使用unittest进行测试,则可能需要将所有有趣的内容打包到setUp方法中。

另请注意,为了避免污染您的环境,您需要在测试结束时致电testbed.deactivate()