I have a Flask route that looks like this:
@app.route('/') def home(): return render_template( 'home.html', greeting:"hello" )
How do I test that the 'home.html'
template was rendered, and that the render_template()
context defined the greeting
variable with a particular value?
These should be (and probably are) pretty easy to test, but I'm really not sure how to do this with Flask and unittest.
render_template is a Flask function from the flask. templating package. render_template is used to generate output from a template file based on the Jinja2 engine that is found in the application's templates folder. Note that render_template is typically imported directly from the flask package instead of from flask.
redirect returns a 302 header to the browser, with its Location header as the URL for the index function. render_template returns a 200, with the index. html template returned as the content at that URL.
In this code block, you import the Flask class and the render_template() function from the flask package. You use the Flask class to create your Flask application instance named app . Then you define a view function (which is a Python function that returns an HTTP response) called hello() using the app.
You can use the assert_template_used
method of TestCase
provided by 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")
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_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)
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With