Тестовая установка Flask с помощью Flask-Babel

Я хотел бы setUp с unittest модулем.

Мое приложение Flask создано с использованием factory (create_app), использует Flask-Babel для i18n/

def create_app(config=None, app_name=None, blueprints=None):
    # Create Flask App instance
    app_name = app_name or __name__
    app = Flask(app_name)
    app.config.from_pyfile(config)

    configure_hook(app)
    configure_blueprints(app, blueprints)
    configure_extensions(app)
    configure_jinja_filters(app)
    configure_logging(app)
    configure_error_handlers(app)
    configure_cli(app)

    return app

Функция create_app вызывает configure_extensions(app), которая выглядит следующим образом:

def configure_extensions(app):
    """Initialize Flask Extensions."""
    db.init_app(app)
    babel.init_app(app)
    csrf.init_app(app)

    @babel.localeselector
    def get_locale():
        # If logged in, load user locale settings.
        user = getattr(g, 'user', None)

        if user is not None:
            return user.locale

        # Otherwise, choose the language from user browser.
        return request.accept_languages.best_match(
            app.config['BABEL_LANGUAGES'].keys())

    @babel.timezoneselector
    def get_timezone():
        user = getattr(g, 'user', None)

        if user is not None:
            return user.timezone

Он отлично работает, когда я запускаю приложение, но я не могу правильно создать юнит-тест, потому что он утверждает такую ​​​​ошибку:

File "C:\projects\rabiang\venv\lib\site-packages\flask_babel\__init__.py", line 127, in localeselector
'a localeselector function is already registered'
    AssertionError: a localeselector function is already registered

Из-за сообщения «функция выбора локали уже зарегистрирована» я подумал, что тот факт, что мой setUp метод unittest вызывался при вызове каждого тестового метода, создает проблему. Таким образом, я изменил @classmethod setUpClass вот так:

# -*- coding: utf-8 -*-
import unittest

from app import create_app, db
from app.blueprints.auth import auth
from app.blueprints.forum import forum
from app.blueprints.main import main
from app.blueprints.page import page


class BasicsTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        blueprints = [main, page, auth, forum]

        app = create_app(config='../test.cfg', blueprints=blueprints)
        cls.app = app.test_client()

        db.create_all()

    @classmethod
    def tearDownClass(cls):
        db.session.remove()
        db.drop_all()

    def test_app_exists(self):
        self.assertFalse(BasicsTestCase.app is None)


if __name__ == '__main__':
    unittest.main()

Однако декораторы @babel.localeselector и @babel.timezoneselector не работают.


person nasiajai    schedule 03.07.2016    source источник


Ответы (1)


Я исправил это, настроив приложение только один раз с помощью функции setUpClass из unittest. См. также ответ Запускать setUp только один раз

person 2ni    schedule 19.08.2016