2013-08-01 3 views
9

У меня возникли проблемы с созданием чертежей Flask-Admin, когда я тестирую свое приложение.Создание проекта Flask-Admin во время тестирования

Это мой Посмотреть класс (используя SQLAlchemy)

## 
# All views that only admins are allowed to see should inherit from this class. 
# 
class AuthView(ModelView): 
    def is_accessible(self): 
     return current_user.is_admin() 

class UserView(AuthView): 
    column_list = ('name', 'email', 'role_code') 

Это, как я инициализацию просмотров:

# flask-admin 
admin.add_view(UserView(User, db.session)) 
admin.init_app(app) 

Однако, когда я пытаюсь запустить более одного теста (ошибка всегда происходит во втором тесте и во всех других тестах, которые следуют), я всегда получаю следующее сообщение об ошибке:

====================================================================== 
ERROR: test_send_email (tests.test_views.TestUser) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/lib/python2.7/site-packages/nose/case.py", line 133, in run 
    self.runTest(result) 
    File "/lib/python2.7/site-packages/nose/case.py", line 151, in runTest 
    test(result) 
    File "/lib/python2.7/site-packages/flask_testing.py", line 72, in __call__ 
    self._pre_setup() 
    File "/lib/python2.7/site-packages/flask_testing.py", line 80, in _pre_setup 
    self.app = self.create_app() 
    File "/tests/test_init.py", line 27, in create_app 
    app = create_app(TestConfig) 
    File "/fbone/app.py", line 41, in create_app 
    configure_extensions(app) 
    File "/fbone/app.py", line 98, in configure_extensions 
    admin.add_view(UserView(User, db.session)) 
    File "/lib/python2.7/site-packages/flask_admin/base.py", line 484, in add_view 
    self.app.register_blueprint(view.create_blueprint(self)) 
    File "/lib/python2.7/site-packages/flask/app.py", line 62, in wrapper_func 
    return f(self, *args, **kwargs) 
    File "/lib/python2.7/site-packages/flask/app.py", line 885, in register_blueprint 
    (blueprint, self.blueprints[blueprint.name], blueprint.name) 
AssertionError: A blueprint's name collision occurred between <flask.blueprints.Blueprint object at 0x110576910> and <flask.blueprints.Blueprint object at 0x1103bd3d0>. Both share the same name "userview". Blueprints that are created on the fly need unique names. 

Странно, что это происходит только во втором тесте, и никогда, когда я просто запускаю приложение.

Когда я отлаживал тесты, первый раз он выполнил именно то, что я ожидал, и добавил проект в приложение после init_app (app). Во второй раз, однако, процесс сразу же прекратился, когда вы достигли шага add_view (что, я думаю, странно, потому что чертежи регистрируются в вызове init_app (приложение)?)

+0

Когда вы говорите «в первый раз», вы имеете в виду в своем первом тесте или вы говорите, что ваш модульный тест завершен, и вы снова используете весь тестовый костюм. – AlexLordThorsen

+0

Я имею в виду первый тест – arnoutaertgeerts

+0

Убедитесь, что вы создали новый экземпляр класса 'Admin' на своей фабрике приложений для каждого теста. Похоже, вы продолжаете добавлять представления к существующему экземпляру класса Admin для каждого тестового прогона. – Joes

ответ

1

Мне пришлось добавить следующее к тесту testdown. Он очищает мнения, которые были добавлены к расширению администратора в испытательной установке

from flask.ext.testing import TestCase 
from flask.ext.admin import BaseView 

# My application wide instance of the Admin manager 
from myapp.extensions import admin 


class TestView(BaseView): 
    ... 


class MyTestCase(TestCase): 
    def setUp(self): 
     admin.add_view(TestView()) 

    def tearDown(self): 
     admin._views.pop(-1) 
     admin._menu.pop(-1) 

Это, конечно, немного рубить, но он получил работу в то время как у меня была эта проблема.

8

То же самое случилось со мной при использовании Flask-Admin и тестирования с помощью pytest. Я смог исправить это, не создавая функции разрыва для моих тестов, перемещая создание экземпляра администратора на фабрику приложений.

До:

# extensions.py 
from flask.ext.admin import Admin 
admin = Admin() 

# __init__.py 
from .extensions import admin 

def create_app(): 
    app = Flask('flask_app') 

    admin.add_view(sqla.ModelView(models.User, db.session)) 
    admin.init_app(app) 

    return app 

После:

# __init__.py 
from flask.ext.admin import Admin 

def create_app(): 
    app = Flask('flask_app') 

    admin = Admin() 

    admin.add_view(sqla.ModelView(models.User, db.session))  
    admin.init_app(app) 

    return app 

Поскольку pytest запускает приложение завод каждый раз, когда он больше не пытается зарегистрировать несколько взглядов на глобальном админ инстанции. Это не соответствует типичному использованию расширения флэшей, но оно работает, и это заставит вашу фабрику приложений наткнуться на представления Flask-Admin.

1

Только в случае, если это помогает любому, другой способ справиться с этим делать:

class MyTestCase(TestCase): 
    def setUp(self): 
     admin._views = [] 

таким образом, вы не должны установить инициализацию администратора() внутри завода. Мне кажется более подходящим.

Смежные вопросы