我用烧瓶做注册和登录:
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>)
你知道为什么吗?在测试登录时,没有这样的错误
答案 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
参数中存在一个看不见的,未处理的异常,它以某种方式将整个过程分解了。