3

我想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

由于消息“已注册语言环境选择器函数”,我认为在调用每个测试方法时调用我的方法这一事实会产生问题setUpunittest因此,我改变了@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器不起作用。

4

1 回答 1

0

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

于 2016-08-19T11:21:25.527 回答