py.test来测试烧瓶寄存器,AssertionError:弹出错误的请求上下文

时间:2014-10-30 07:10:07

标签: python pytest flask-login

我用烧瓶做注册和登录:

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>)
你知道为什么吗?在测试登录时,没有这样的错误

4 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:4)

似乎你必须用这样的东西包裹测试调用:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

以我为例,我使用了flask.ctx.AppContext.__exit__方法,发现exc_value参数中存在一个看不见的,未处理的异常,它以某种方式将整个过程分解了。