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.