我有我的Flask应用程序,它使用Flask-Assets,在尝试运行单元测试用例时,除了第一个测试用例外,其他测试用例都失败并出现以下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创建一个应用程序实例,并且为所有其他测试用例维护。
我在拆解方法中尝试了del(app)
,但没有帮助。
有没有办法解决它?
您可能有一个资产环境的全局对象,您已将其声明为:
在文件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)
希望这有帮助,干杯