Как протестировать 404 не найден с Django Testing framework?
Я пытаюсь автоматизировать тестирование 404 страниц с помощью платформы тестирования Django 1.4.
если я распечатаю 127.0.0.1:8000/something/really/weird/
в адресной строке браузера с запущенным сервером разработки я вижу страницу 404 с правильным статусом "404 не найден" (как показывает firebug).
но если я пытаюсь использовать этот код для проверки:
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)
тест терпит неудачу с этим выходом:
$./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'...
Я серьезно удивлен, получив 200 код здесь. Кто-нибудь знает, почему на земле это происходит?
обновление:
здесь лежит urls.py:http://pastebin.com/DikAVa8T и фактический неудачный тест:
def test_wrong_uri_returns_404(self):
response = self.client.get('/something/really/weird/')
self.assertEqual(response.status_code, 404)
все происходит в проекте https://github.com/gbezyuk/django-app-skeleton
2 ответов
проблема в том, что ваш класс ViewFor404 возвращает код состояния 200. Посмотрите на определение TemplateView Джанго:
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)
Так что все ваши класса является render_to_response, который генерирует '200' ответ.
Если вам нужно переопределить обработчик 404, вы должны сделать что-то вроде этого в представлении:
return HttpResponseNotFound('<h1>Page not found</h1>')
(Я не знаю эквивалента в представлениях на основе классов)
или еще лучше, вы можете избежать настройки посмотреть? К настроить отображение 404, вы можете просто создать 404.html-шаблон (в шаблонах/ каталоге вашего сайта), и он будет подхвачен средством просмотра ошибок Django.
попробовать
response = self.client.get('/something/really/weird/') # note the '/' before something
127.0.0.1:8000/something/really/weird/
is /something/really/weird/
в пути относительно корня,не
something/really/weird
something/really/weird/
/something/really/weird