2015-02-12 1 views
3

Так что я пробовал написать несколько тестов для своего приложения Flask на пару дней, но я не могу заставить его работать. Тест проходит, но он застревает в PASSED.Я потерялся, пытаясь написать тесты в мое приложение для фляшек

Я клонировал кукурузную колбу (cookiecutter-flask), и он запускает веб-тест вместе с pytest (я думаю). Мой conftest.py выглядит так же, как это делает в репо (conftest.py)

Это мои текущие тесты:

def test_app(testapp): 
    app = create_app(TestConfig) 
    res = testapp.get('/') 
    res.status_code == 200 

Этот проход и продолжается.

def test_create_admin_user(db, testapp): 
    password = bcrypt.generate_password_hash('test') 

    User.create(
     uid='00000000000000000000', 
     email='[email protected]', 
     password=password, 
     active=1 
    ) 

    user = User.query.filter_by(email='[email protected]').first() 

    assert user.email == '[email protected]' 

Здесь я потерялся, и тест застрял на PASSED и ничего не делает. Когда я принудительно прервать процесс я получаю это:

Traceback (most recent call last): 
    File "manage.py", line 68, in <module> 
    manager.run() 
    File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask_script/__init__.py", line 412, in run 
    result = self.handle(sys.argv[0], sys.argv[1:]) 
    File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask_script/__init__.py", line 383, in handle 
    res = handle(*args, **config) 
    File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask_script/commands.py", line 216, in __call__ 
    return self.run(*args, **kwargs) 
    File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask/ctx.py", line 386, in __exit__ 
    self.auto_pop(exc_value) 
    File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask/ctx.py", line 374, in auto_pop 
    self.pop(exc) 
    File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask/ctx.py", line 357, in pop 
    % (rv, self) 
AssertionError: Popped wrong request context. (<RequestContext 'http://localhost/' [GET] of backend.app> instead of <RequestContext 'http://localhost/' [GET] of backend.app>) 

Я нашел следующую нить в колбе о тестировании (предоставившем это Колба-тестирование, но я подумал, что это имеет какое-то отношение, может быть, это не : issue) и изменил мою тестовую конфигурацию, поэтому он содержит PRESERVE_CONTEXT_ON_EXCEPTION = False, но он все еще просто зависает.

У кого-нибудь есть идеи, которые я могу попробовать? Я не очень хорошо разбираюсь в тестировании, поэтому, вероятно, это то, что я делаю неправильно.

+0

Просто оглядываясь на исходный код 'cookiecutter-flask', и они, похоже, используют [webtest] (http://webtest.readthedocs.org/en/latest/). В первом тесте вы создаете экземпляр приложения, но не используете его, есть ли причина для этого? – pech0rin

ответ

0

Вы должны использовать правильный контекст приложение

def test_create_admin_user(db, testapp): 
    with app.app_context(): 
     password = bcrypt.generate_password_hash('test') 
     User.create(
      uid='00000000000000000000', 
      email='[email protected]', 
      password=password, 
      active=1 
     ) 

     user = User.query.filter_by(email='[email protected]').first() 
     assert user.email == '[email protected]' 

См https://github.com/Leo-G/Flask-Scaffold/blob/master/scaffold/app/tests.py для полного примера

1

db приспособление обеспечивает flask-cookiecutter склонен к фиксации, и это, вероятно, что висит тесты (это было для меня, когда я впервые начал писать тесты для приложения flask-cookiecutter).

Вот лучше db приспособление (для замены в вашем файле tests/conftest.py):

@pytest.yield_fixture(scope='function') 
def db(app): 
    _db.app = app 
    with app.app_context(): 
     _db.session.remove() 
     _db.drop_all() 
     _db.create_all() 

    yield _db 

    _db.session.remove() 
    _db.drop_all() 

    ## This dispose() call is needed to avoid the DB locking 
    ## between tests. 
    ## Thanks to: 
    ## http://stackoverflow.com/a/18293157/2066849 
    _db.get_engine(_db.app).dispose() 

Может быть проблема с контекстом приложения, но не склонен полностью повесить тесты, как много как сеанс БД.

Вы также должны рассмотреть возможность замены этого светильника (и большинства других светильников) на scope='session', поэтому БД не нужно повторно создавать для каждого отдельного теста (и поэтому приложение не обязательно должно быть повторно - несмотря на то, что это тривиальные накладные расходы по сравнению с БД). Но тогда вы должны выполнить некоторую очистку вручную, после отдельных тестов, которые изменяют записи БД.