2012-08-16 48 views
4

我有我的Flask應用程序,它使用Flask-Assets,並試圖運行unittest的情況下,除了第一個測試用例,其他的失敗以及下面的RegisterError。Flask-Assets和Flask-Testing引發RegisterError:另一個bundle已經註冊

====================================================================== 
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創建應用程序的實例,這是維護所有其他測試用例。

我在拆卸方法中試過del(app),但沒有幫助。

有什麼方法可以解決它嗎?

回答

1

你可能有資產的環境,你已經宣佈爲一個全局對象:

文件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 

問題是,當你用你的應用程序初始化你的環境時,註冊的包不會被清除。所以,你應該做手工,因爲這樣在你的測試用例:

文件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) 

希望這有助於 乾杯

相關問題