Django Test Client post() возвращает 302, несмотря на ошибку при просмотре сообщения()

В настоящее время я пишу некоторые базовые тесты, чтобы гарантировать, что страницы в средстве Django среднего размера правильно загружаются и POSTing. Тем не менее, использование django.test.client.Client не надежно проваливается, когда это должно быть. Он возвращает ответ 302, даже если в моем коде явно были ошибки.

в моем приложении /urls.py:

url(r'^mymodel/create/$', 
views.MyModelView.as_view(),
name = 'my_model_create'),

Затем, пытаясь преднамеренно создать ответ 500, я сделал следующее:

class MyModelCreateView(MyModelView, CreateView):

    def post(self, request, *args, **kwargs):
        print self.hello
        self.object = MyModel()
        return super(MyModelCreateView, self).post(request, *args, **kwargs)

Очевидно, что в представлении нет объекта с именем hello. Это происходит не так, как ожидалось при попытке отправить запрос через браузер.

и даже дошел до замены "print self.hello" на

return HttpResponse(status = 500)

и все же, я все еще получаю следующее:

#We have a model called Client, so it 
#is imported as RequestClient to avoid conflicts
In [1]: from django.test.client import Client as RequestClient

In [2]: client = RequestClient()

In [3]: response = client.post("/app/mymodel/create/")

In [4]: response.status_code
Out[4]: 302

Ясно, что проблема здесь в том, что между клавиатурой и стулом, поскольку нет причин, по которым Client()/RequestClient() не должен возвращать ошибку 500, если все сделано правильно. Даже некоторые проблемы возникают, так как я получаю 302 ответа на запросы POST вместо 200 ответов, но это может быть потому, что мы используем HttpRedirect.

Кто-нибудь знает, что может быть проблемой здесь? Для справки я на Python 2.7 и Django 1.5 (хотя мне, возможно, придется быть совместимым с Django 1.4).

Ответ 1

Не совсем понятно, почему вы получаете перенаправление, но если вы хотите следовать ему, вам нужно сообщить RequestClient о переадресации - за документация:

Если вы установили follow в True, клиент выполнит любые переадресации и Атрибут redirect_chain будет установлен в объекте ответа, содержащем кортежей промежуточных URL-адресов и кодов состояния.

Итак, ваш тестовый код должен выглядеть так:

python response = client.post("/app/mymodel/create/", follow=True)

Стоит проверить цепочку запросов, чтобы увидеть, где именно она была маршрутизирована.

Ответ 2

Кроме того, когда страница нуждается в аутентификации (login), и вы не вошли в систему TestCase, страница найдена (302), но не достигнута (возможно, перенаправляется на страницу входа в систему.

В этом случае зависит от конфигурации auth.