3

おおよそ次の構成を持つ Flask アプリケーションの単体テストを作成しています。

/myapplication
    runner.py
    /myapplication
        __init__.py
    /special
        __init__.py
        views.py
        models.py
    /static
    /templates
        index.html
        /special
            index_special.html
    /tests
        __init__.py
        /special
            __init__.py
            test_special.py

special特に、モジュールが期待どおりに動作することをテストしたいと考えています。

以下を定義しました。

  • special/views.py:

    mod = Blueprint('special', __name__, template_folder="templates")
    @mod.route('/standard')
    def info():
        return render_template('special/index_special.html')
    
  • myapplication/__init__.py:

    app = Flask(__name__)
    
    def register_blueprints(app):
         from special.views import mod as special_blueprint
         app.register_blueprint(special_blueprint, url_prefix='/special')
    
    register_blueprints(app)
    
  • myapplication/tests/test_special.py

    class TestSpecial:
        @classmethod
        def create_app(cls):
            app = Flask(__name__)
            register_blueprints(app)
            return app
    
        @classmethod
        def setup_class(cls):
            cls.app = cls.create_app()
            cls.client = cls.app.test_client()
    
        def test_connect(self):
            r = self.client.get('/standard')
            assert r.status_code == 200
    

アプリケーション自体は正常に動作しますが、test_connect単体テストはTemplateNotFound: special/index_special.html例外で失敗します。

対応するテンプレートの場所をテストに伝えるにはどうすればよいですか? Flask-testingを使用してテンプレートのレンダリングをバイパスすることは、実際にはオプションではありません...

4

1 に答える 1

2

template_folderアプリケーション オブジェクト コンストラクターに渡すことができます。

app = Flask(__name__, template_folder='../templates')

絶対パスを使用する必要があるかもしれませんが、わかりません。

http://flask.pocoo.org/docs/api/#flask.Flask

create_app私はほとんどの場合、アプリケーション コードで関数を作成し、それをテストで使用する傾向があります。これは、アプリケーション オブジェクトの一貫性を維持するためです。単一の設計図または小さなものを分離してテストしたい場合にのみ、別のアプリを作成します。

def create_app(conf_obj=BaseSettings, conf_file='/etc/mysettings.cfg'):
    app = Flask(__name__)
    app.config.from_object(conf_obj)
    app.config.from_pyfile(conf_file, silent=True)
    .... blueprints etc
    return app

次に、私のテストで:

class TestFoo(unittest.TestCase):

    def setUp(self):
        self.app = create_app(TestSettings)
        ....
于 2013-05-28T14:48:37.930 に答える