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”必须是对象