Контекст тестовой фляги render_template()
Вопрос с колдуном Newbie.
У меня есть маршрут Flask, который выглядит так:
@app.route('/')
def home():
return render_template(
'home.html',
greeting:"hello"
)
Как проверить, что был обработан шаблон 'home.html'
, и что в контексте render_template()
определена переменная greeting
с определенным значением?
Они должны быть (и, вероятно, есть) довольно легко протестировать, но я действительно не уверен, как это сделать с помощью Flask и unittest.
Ответы
Ответ 1
Вы можете использовать метод assert_template_used
TestCase
, предоставленный flask-testing.
from flask.ext.testing import TestCase
class MyTest(TestCase):
def create_app(self):
return myflaskapp
def test_greeting(self):
self.app.get('/')
self.assert_template_used('hello.html')
self.assert_context("greeting", "hello")
Метод create_app
должен предоставить ваше флеш-приложение.
Ответ 2
Мое предложение было бы взглянуть на фляжную документацию для тестирования.
Используя документы в качестве руководства, вы должны иметь возможность настроить тестовый пример, который может проверять содержимое ответа.
import unittest
import yourappname
class MyAppTestCase(unittest.TestCase):
def setUp(self):
self.app = yourappname.app.test_client()
def test_greeting(self):
rv = self.app.get('/')
self.assertIn('hello', rv.data)
где yourappname
- имя вашего приложения/проекта.
Ответ 3
Официальная документация Flask предполагает, что вы используете template_rendered
сигнал (доступный с версии 0.6) для модульного тестирования ваших шаблонов и переменных, используемых для его отображения.
Например, вот менеджер контекстных контекстов, который можно использовать в unittest для определения того, какие шаблоны были визуализированы и какие переменные были переданы шаблону:
from flask import template_rendered
from contextlib import contextmanager
@contextmanager
def captured_templates(app):
recorded = []
def record(sender, template, context, **extra):
recorded.append((template, context))
template_rendered.connect(record, app)
try:
yield recorded
finally:
template_rendered.disconnect(record, app)
Теперь это можно легко связать с тестовым клиентом:
with captured_templates(app) as templates:
rv = app.test_client().get('/')
assert rv.status_code == 200
assert len(templates) == 1
template, context = templates[0]
assert template.name == 'index.html'
assert len(context['items']) == 10
Ответ 4
Вы можете использовать настройку Jinja на своей странице Html, передать переменную на страницу и посмотреть, обновляется ли она.
http://flask.pocoo.org/docs/0.11/templating/#jinja-setup
http://jinja.pocoo.org/
В качестве примера:
шаблон колбы
@app.route('/')
def home():
return render_template(
'home.html',
greetingDictionary = {"greeting": "hello" , "forthoseabouttorock" :"wesaluteyou" }
)
html page
{% for key in greetingDictionary %}
<h1>{{key}}</h1>
<p>{{greetingDictionary[key]}}</p>
{% endfor %}