py.test для проверки регистра фляги, AssertionError: выскочил неверный контекст запроса
Я использую флягу, чтобы зарегистрироваться и войти:
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>)
Ты знаешь почему? И при тестировании логина такой ошибки не было
5 ответов
Это известная проблема с колбой. Вы получаете два исключения вместо одного. Просто добавь PRESERVE_CONTEXT_ON_EXCEPTION = False
в ваш тестовый конфиг.
Кажется, вы должны обернуть свои тестовые вызовы примерно так:
with self.app.test_client() as client:
data = {'email': 'test@test', 'password': 'password'}
rv = client.post('/2014-10-17/register', data=json.dumps(data))
...
Когда у вашего testA есть синтаксическая ошибка или другие исключения, tearDown()
метод, который выполняет задание контекста, не будет достигнут, поэтому контекст testA не был корректно вытолкнут. Тогда ваш следующий тест, который мы называем testB, откроет контекст testA. Итак, вот почему вы получили ошибку AssertionError: Popped wrong request context.
,
Проверьте ошибку в своем тестовом коде, исправьте ее. Тогда AssertionError
исчезнет автоматически.
У меня была такая же проблема с и
unittest
. Решается проверкой на
current_app
а также
app.testing
и не нажимая
app_context()
при использовании однопоточности
rq
режим.
app = current_app or create_app()
if not app.testing:
app.app_context().push()
В моем случае я пошел в flask.ctx.AppContext.__exit__
метод и обнаружил невидимое необработанное исключение в exc_value
аргумент, который как-то разбил все это на части.