Test Flask render_template() context Test Flask render_template() context flask flask

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.