4

Flask-Assets を使用する Flask アプリがあり、最初のテストケースを除いて、単体テスト ケースを実行しようとすると、次の RegisterError で失敗します。

======================================================================
ERROR: test_login_page (tests.test_auth.AuthTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/cnu/env/flenv/lib/python2.7/site-packages/nose/case.py", line 133, in run
    self.runTest(result)
  File "/Users/cnu/env/flenv/lib/python2.7/site-packages/nose/case.py", line 151, in runTest
    test(result)
  File "/Users/cnu/env/flenv/lib/python2.7/site-packages/flask_testing.py", line 72, in __call__
    self._pre_setup()
  File "/Users/cnu/env/flenv/lib/python2.7/site-packages/flask_testing.py", line 80, in _pre_setup
    self.app = self.create_app()
  File "/Users/cnu/Projects/Bookworm/App/tests/test_auth.py", line 8, in create_app
    return create_app('testing.cfg')
  File "/Users/cnu/Projects/Bookworm/App/bookworm/__init__.py", line 118, in create_app
    configure_extensions(app)
  File "/Users/cnu/Projects/Bookworm/App/bookworm/__init__.py", line 106, in configure_extensions
    assets.register('js_all', js)
  File "/Users/cnu/env/flenv/src/webassets/src/webassets/env.py", line 374, in register
    'as "%s": %s' % (name, self._named_bundles[name]))
RegisterError: Another bundle is already registered as "js_all": <Bundle output=assets/packed.js, filters=[<webassets.filter.jsmin.JSMin object at 0x10fa8af90>], contents=('js/app.js',)>

最初のテストケースが実行される前にこれが発生する理由についての私の理解では、create_app は app のインスタンスを作成し、これは他のすべてのテストケースで維持されます。

ティアダウン法を試してみdel(app)ましたが、役に立ちません。

それを修正する方法はありますか?

4

1 に答える 1

3

おそらく、次のように宣言したアセット環境用のグローバル オブジェクトがあります。

ファイル内app/extensions.py:

from flask.ext.assets import Environment
assets = Environment()

次に、create_appメソッドのどこかで、環境を初期化する必要があります。

ファイル内app/__init__.py:

from .extensions import assets

def create_app(): 
    app = Flask(__name__)
    ...
    assets.init_app(app)
    ...
    return app

問題は、アプリで環境を初期化すると、登録されたバンドルがクリアされないことです。したがって、TestCase で手動で行う必要があります。

ファイル内tests/__init__.py

from app import create_app
from app.extensions import assets

class TestCase(Base): 

    def create_app(self): 
        assets._named_bundles = {} # Clear the bundle list
        return create_app(self)

これが役に立てば幸いです、乾杯

于 2014-01-06T10:35:39.560 に答える