How to test 404 NOT FOUND with django testing framework?
django, http-status-code-404, testing
Solution
The problem is that your ViewFor404 class returns a 200 status code. Look at Django's TemplateView definition:
class TemplateView(TemplateResponseMixin, View):
"""
A view that renders a template.
"""
def get_context_data(self, **kwargs):
return {
'params': kwargs
}
def get(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
return self.render_to_response(context)
so all your class does is a render_to_response, which generates a '200' response.
If you need to override the 404 handler, you should do something more like this in the view:
return HttpResponseNotFound('<h1>Page not found</h1>')
(I don't know the equivalent in class-based views)
Or better yet, can you avoid customizing the View? To customize the 404 display, you can just create a 404.html template (in your site's templates/ directory), and it will be picked up by Django's error viewer.
Problem
I am trying to automate 404 pages testing using Django 1.4's testing framework. If I print `127.0.0.1:8000/something/really/weird/` in browser address bar with development server running, I see a 404 page, with correct "404 NOT FOUND" status (as firebug shows). But if I try to use this code for testing: ``` from django.test import TestCase class Sample404TestCase(TestCase): def test_wrong_uri_returns_404(self): response = self.client.get('something/really/weird/') self.assertEqual(response.status_code, 404) ``` the test fails with this output: ``` $./manage.py test main Creating test database for alias 'default'... .F ====================================================================== FAIL: test_wrong_uri_returns_404 (main.tests.Sample404TestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File ".../main/tests.py", line 12, in test_wrong_uri_returns_404 self.assertEqual(response.status_code, 404) *AssertionError: 200 != 404* ---------------------------------------------------------------------- Ran 2 tests in 0.031s FAILED (failures=1) Destroying test database for alias 'default'... ``` I'm seriously surprised with getting 200 code here. Anyone have any idea why on earth this is happening? updated: here lies urls.py: http://pastebin.com/DikAVa8T and actual failing test is: ``` def test_wrong_uri_returns_404(self): response = self.client.get('/something/really/weird/') self.assertEqual(response.status_code, 404) ``` everything is happening in project https://github.com/gbezyuk/django-app-skeleton