py.test 测试烧瓶寄存器,AssertionError: Popped wrong request context

Posted

技术标签:

【中文标题】py.test 测试烧瓶寄存器,AssertionError: Popped wrong request context【英文标题】:py.test to test flask register, AssertionError: Popped wrong request context 【发布时间】:2014-12-26 03:24:31 【问题描述】:

我正在使用flask进行注册和登录:

from flask.ext.security.views import register, login

class Register(Resource):
    def post(self):
        return register()

class Login(Resource):
    def post(self):
        return login()

api.add_resource(Login, '/login')
api.add_resource(Register, '/register')

然后我使用 py.test 来测试这个类:

class TestAPI:
    def test_survey(self, app):
        client = app.test_client()
        data = 'email': 'test@test', 'password': 'password'
        rv = client.post('/2014-10-17/register',
                          data=json.dumps(data))
        ...

当我运行测试时,出现如下错误:

AssertionError: Popped wrong request context.  (<RequestContext 'http://localhost/2014-10-17/register' [POST] of panel.app> instead of <RequestContext 'http://localhost/' [GET] of panel.app>)

你知道为什么吗?并且在测试登录时,没有这样的错误

【问题讨论】:

【参考方案1】:

这是一个已知的烧瓶problem。您收到两个例外而不是一个。只需将 PRESERVE_CONTEXT_ON_EXCEPTION = False 添加到您的测试配置中即可。

【讨论】:

【参考方案2】:

看来你必须用这样的东西来包装你的测试调用:

with self.app.test_client() as client:
    data = 'email': 'test@test', 'password': 'password'
    rv = client.post('/2014-10-17/register', data=json.dumps(data))
    ...

【讨论】:

【参考方案3】:

当您的 testA 出现语法错误或其他异常时,将无法访问执行上下文弹出作业的 tearDown() 方法,因此无法正确弹出 testA 的上下文。 那么你的下一个测试我们称之为 testB 将弹出 testA 的上下文。所以,这就是你得到错误 AssertionError: Popped wrong request context. 的原因。

检查测试代码中的错误,修复它。然后AssertionError会自动消失。

【讨论】:

【参考方案4】:

就我而言,我使用了flask.ctx.AppContext.__exit__ 方法,发现exc_value 参数中有一个不可见的、未处理的异常,它以某种方式将整个事情破坏了。

【讨论】:

我在退出 with app.app_context(): 子句时遇到了同样的问题。当我设置 FLASK_DEBUG=0 时,我发现问题消失了。

以上是关于py.test 测试烧瓶寄存器,AssertionError: Popped wrong request context的主要内容,如果未能解决你的问题,请参考以下文章

AssertionError [ERR_ASSERTION]:无效的寄存器选项“value”必须是对象

Py.test 失败,但 ./manage.py 测试工作正常

使用 py.test 打印测试执行时间并锁定慢速测试

测试代码是不是从 py.test 会话中执行

如果定义了构造函数,py.test 会跳过测试类

如何配置 PyCharm 以运行 py.test 测试?