Here's a view using TemplateResponse. This test will run without needing to set up urls or add templates to the file system.
def my_view(request, template_name):
return TemplateResponse(request, template_name, {"foo": "bar"})
class MyTest(TestCase):
def test_get(self):
request = RequestFactory().get("/")
response = my_view(request, "template.html")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context_data["foo"], "bar")
If I use render, the template render is called, so I have to override the template loaders:
from django.test.utils import (
setup_test_template_loader,
restore_template_loaders,
)
def my_view(request, template_name):
return render(request, template_name, {"foo": "bar"})
class MyTest(TestCase):
def setUp(self):
templates = {
"template.html": "{{ foo }}",
}
setup_test_template_loader(templates)
def tearDown(self):
restore_template_loaders()
def test_get(self):
request = RequestFactory().get("/")
response = my_view(request, "template.html")
# no access to context data on response
# self.assertEqual(response.status_code, 200)
self.assertEqual(response.content, "bar")