I am trying to write tests for my custom Error Page view:- Docs can be found here
Also for writing test cases for i have included these urls as suggested here :-
if settings.DEBUG:
urlpatterns += [
url(r'^404/$', page_not_found_view),
url(r'^500/$', my_custom_error_view),
url(r'^400/$', bad_request_view),
url(r'^403/$', permission_denied_view),
]
handler404 = page_not_found_view
handler500 = my_custom_error_view
handler403 = permission_denied_view
handler400 = bad_request_view
and views.py is :-
def page_not_found_view(request):
t = loader.get_template('error/HTTP404.html')
html = html = t.render({})
return HttpResponseNotFound(html)
def my_custom_error_view(request):
t = loader.get_template('error/HTTP500.html')
html = html = t.render({})
return HttpResponseServerError(html)
def permission_denied_view(request):
t = loader.get_template('error/HTTP403.html')
html = html = t.render({})
return HttpResponseForbidden(html)
def bad_request_view(request):
t = loader.get_template('error/HTTP400.html')
html = html = t.render({})
return HttpResponseBadRequest(html)
When i am hitting that urls manually i am getting proper response code i.e 500
for visiting /500
and so on.
Since those urls will be included only if setting.DEBUG=True
by default and the test cases run in DEFAULT=False
and mode i tried to override it using @override_settings
decorator
My test.py file is :-
@override_settings(DEBUG=True)
class ErroCodeUrl(TestCase):
def test_400_error(self):
response = self.client.get('/400/')
self.assertEqual(response.status_code, 500)
def test_403_error(self):
response = self.client.get('/403/')
self.assertEqual(response.status_code, 500)
def test_404_error(self):
response = self.client.get('/404/')
self.assertEqual(response.status_code, 500)
def test_500_error(self):
response = self.client.get('/500/')
self.assertEqual(response.status_code, 500)
But using this @override_settings
is not making any difference i am getting same assertion error with or without it. I am getting 404 status code for every test i.e
For test_500_error
:-
response = self.client.get('/500/')
AssertionError: 404 != 500
For test_400_error
:-
response = self.client.get('/500/')
AssertionError: 404 != 400
Note :- The same error code '404is returned when i visited these url with
DEBUG=False`.
Here is a way to test your 500
from django.test import TestCase
from django.test.client import RequestFactory
from .views import my_custom_error_view
class TestMyErrorPages(TestCase):
def test_error_handlers(self):
factory = RequestFactory()
request = factory.get('/')
response = my_custom_error_view(request)
self.assertEqual(response.status_code, 500)