Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 21, 2016 22:24:59

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Flask тестирование приложения

Здравствуйте, пытаюсь написать тесты для простого приложения на Flask.
Структура проекта:

app/
static/
templates/
forms.py
models.py
views.py
migrations/
config.py
manage.py
tests.py
Методы setUp и tearDown у меня такие же, как и в учебном проекте из книги Мигеля Гринберга
# tests.py
import unittest
from app import create_app, db
from flask import current_app
class TestCase(unittest.TestCase):
    def setUp(self):
        self.app = create_app('test_config')
        self.app_context = self.app.app_context()
        self.app_context.push()
        db.create_all()
        self.client = self.app.test_client()
    def tearDown(self):
        db.session.remove()
        db.drop_all()
        self.app_context.pop()
    def test_app_exists(self):
        self.assertFalse(current_app is None)
    def test_hello(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)

# config.py
class Config(object):
    SECRET_KEY = os.environ.get('COURSES_PROJECT_SECRET_KEY')
    SQL_COMMIT_ON_TEARDOWN = True
 
    @staticmethod
    def init_app(app):
        pass
class DevConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('COURSES_PROJECT_DATABASE')
class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_COURSES_PROJECT_DATABASE')
    CSRF_ENABLED = False
config = {'default': DevConfig,
          'dev_config': DevConfig,
          'test_config': TestingConfig}
# app/__init__.py
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from config import config
db = SQLAlchemy()
def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    db.init_app(app)
    return app
app = create_app('default')
from . import views
Когда запускаю тесты, то test_hello проваливается из-за возврата 404 кода ответа. В чем может быть ошибка?Возможно это связано с тем, что экземпляр приложения в методе setUp ничего не знает о вьюхах? Хотя, вроде, все делаю, как в учебном примере.

Отредактировано Stright (Апрель 21, 2016 22:26:06)

Офлайн

#2 Апрель 22, 2016 22:09:15

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Flask тестирование приложения

Господи. Зачем. Есть же модуль flask-testing
Ссылочка

Офлайн

#3 Апрель 22, 2016 22:26:36

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Flask тестирование приложения

Спасибо А все-таки почему не проходит тест test_hello? Мое предположение верно?
Просто хочется разобраться, потому что, если не получается, значит чего-то недопонимаю

Отредактировано Stright (Апрель 22, 2016 22:29:00)

Офлайн

#4 Апрель 23, 2016 02:47:28

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Flask тестирование приложения

Вроде как разобрался, в учебном примере используюся блюпринты, которые регистрируются внутри фабричной функции create_app, поэтому экземпляр Flask в setUp методе содержит информацию об url и вьюхах. В моем же случае, блюпринты не используются, и в self.app этих данных нет.

Офлайн

#5 Апрель 23, 2016 21:23:16

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Flask тестирование приложения

А почему в create_app не прицепить вьюхи ? Какой толк от инстанса фласка без вьюх ?

Офлайн

#6 Апрель 23, 2016 21:44:45

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Flask тестирование приложения

Толк был, пока я не начал тесты писать, во views.py я добавлял url как полагается через декораторы app.route, но когда дело дошло до тестов, то обнаружил, что в инстансе, который создается в setUp, нет никакой информации о вьюхах. Пробовал прицепить к app вьюхи в create_app, но тогда появляются проблемы с циклическим импортом, остановился на варианте с регистрацией блюпринтов в create_app, там вообще никаких проблем.

Отредактировано Stright (Апрель 23, 2016 21:49:04)

Офлайн

#7 Апрель 24, 2016 10:27:42

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Flask тестирование приложения

Чистый app.route без блупринтов еще то зло. Особенно хак с обходом циклического импорта…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version