Search code examples
pythondjangopytestdjango-testing

How to run tests with `DEBUG=TRUE` in Django


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 withDEBUG=False`.


Solution

  • 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)