3

モジュールsetUpでやりたいです。unittest

私のFlaskアプリはファクトリ(create_app)を使用して作成され、i18n /にFlask-Babelを使用しています

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

「localeselector 関数は既に登録されています」というメッセージが表示されたため、各テスト メソッドが呼び出されたときに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は機能しません。

4

1 に答える 1

0

unittest の関数 setUpClass を使用してアプリを一度だけ設定することで修正しました。回答も参照してくださいsetUp を 1 回だけ実行する

于 2016-08-19T11:21:25.527 に答える