2013-05-28 5 views
2

Я пишу тесты для приложения Колбы, который имеет примерно следующую организацию:шаблонов, когда модульное тестирование приложения КОЛБЫ

/myapplication 
    runner.py 
    /myapplication 
     __init__.py 
    /special 
     __init__.py 
     views.py 
     models.py 
    /static 
    /templates 
     index.html 
     /special 
      index_special.html 
    /tests 
     __init__.py 
     /special 
      __init__.py 
      test_special.py 

В частности, я хочу, чтобы проверить, что special модуля работает, как ожидался.

Я определил следующее:

  • в special/views.py:

    mod = Blueprint('special', __name__, template_folder="templates") 
    @mod.route('/standard') 
    def info(): 
        return render_template('special/index_special.html') 
    
  • в myapplication/__init__.py:

    app = Flask(__name__) 
    
    def register_blueprints(app): 
        from special.views import mod as special_blueprint 
        app.register_blueprint(special_blueprint, url_prefix='/special') 
    
    register_blueprints(app) 
    
  • в myapplication/tests/test_special.py

    class TestSpecial: 
        @classmethod 
        def create_app(cls): 
         app = Flask(__name__) 
         register_blueprints(app) 
         return app 
    
        @classmethod 
        def setup_class(cls): 
         cls.app = cls.create_app() 
         cls.client = cls.app.test_client() 
    
        def test_connect(self): 
         r = self.client.get('/standard') 
         assert r.status_code == 200 
    

В то время как само приложение работает отлично, блок-тест test_connect терпит неудачу с TemplateNotFound: special/index_special.html исключением.

Как я могу проверить тесты, где найти соответствующие шаблоны? Обходя рендеринг шаблонов с помощью Flask-testing это не вариант ...

ответ

1

Вы можете передать template_folder в конструктор объекта приложения:

app = Flask(__name__, template_folder='../templates') 

Вы, возможно, придется использовать абсолютный путь, я не уверен, ,

http://flask.pocoo.org/docs/api/#flask.Flask

я в основном, как правило, имеют create_app функцию с моим кодом приложения и использовать это в моих тестах, просто так, объект приложения является последовательным. Я создам только отдельное приложение, если хочу протестировать один проект или что-то маленькое в изоляции.

def create_app(conf_obj=BaseSettings, conf_file='/etc/mysettings.cfg'): 
    app = Flask(__name__) 
    app.config.from_object(conf_obj) 
    app.config.from_pyfile(conf_file, silent=True) 
    .... blueprints etc 
    return app 

Тогда в моих тестах:

class TestFoo(unittest.TestCase): 

    def setUp(self): 
     self.app = create_app(TestSettings) 
     .... 
+0

Использование 'template_folder' аргумент не рекомендуется, получается: шаблоны могут относиться к некоторым маршрутам, которые не будут должным образом сконфигурированы. Использование фабричного подхода, который вы описываете, - это путь, при условии, что чертежи правильно определены (и смешивание чертежей со стандартным способом '@ app.route' задает проблемы ...) –

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