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 аргумент, который как-то разбил все это на части.

Другие вопросы по тегам