首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Flask-Babel设置Flask测试

使用Flask-Babel设置Flask测试
EN

Stack Overflow用户
提问于 2016-07-03 20:53:33
回答 1查看 609关注 0票数 3

我想用unittest模块实现setUp

我的Flask应用程序是使用工厂创建的(create_app)使用Flask-Babel for i18n/

代码语言:javascript
复制
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),如下所示:

代码语言:javascript
复制
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

当我运行app时,它工作得很好,但我不能正确地创建单元测试,因为它断言错误如下:

代码语言:javascript
复制
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 Due“,我认为在调用每个测试方法时都会调用我的unittestsetUp方法,这会产生问题。因此,我对@classmethod setUpClass进行了如下更改:

代码语言:javascript
复制
# -*- 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装饰器不起作用。

EN

回答 1

Stack Overflow用户

发布于 2016-08-19 19:21:26

我修复了它,只用unittest中的函数setUpClass设置了应用程序一次。另请参阅答案Run setUp only once

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38170136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档