【问题标题】:Flask test setup with Flask-Babel使用 Flask-Babel 进行 Flask 测试设置
【发布时间】:2016-11-05 07:48:21
【问题描述】:

我想setUpunittest 模块。

我的 Flask 应用是使用工厂创建的 (create_app) 使用 Flask-Babel for 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

由于消息“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 装饰器不起作用。

【问题讨论】:

    标签: python unit-testing flask python-babel


    【解决方案1】:

    我通过使用 unittest 中的函数 setUpClass 仅设置一次应用程序来修复它。 另见答案Run setUp only once

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多