Test Flask render_template() context
You can use the assert_template_used
method of TestCase
provided by flask-testing.
from flask.ext.testing import TestCaseclass 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")
The method create_app
must provide your flask app.
Flask official documentation suggests that you use the template_rendered
signal (available since version 0.6) for unit-testing your templates and the variables used to render it.
For example, here is a helper context manager that can be used in a unittest to determine which templates were rendered and what variables were passed to the template:
from flask import template_renderedfrom contextlib import contextmanager@contextmanagerdef 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)
This can now easily be paired with a test client:
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
My suggestion would be to take a look at the Flask documentation for testing.
Using the docs as a guide you should be able to set up a test case that can check the contents of the response.
import unittestimport yourappnameclass 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)
where yourappname
is the name of your app/project.