Как протестировать 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