Подтвердить что ты не робот

Django: тестирование, если страница перенаправлена ​​на нужный URL-адрес

В моем приложении django у меня есть система аутентификации. Итак, если я не вхожу в систему и не пытаюсь получить доступ к личной информации профиля, я перенаправляюсь на страницу входа.

Теперь мне нужно написать тестовый пример. Ответы от браузеров, которые я получаю, это:

GET /myprofile/data/some_id/ HTTP/1.1 302 0
GET /account/login?next=/myprofile/data/some_id/ HTTP/1.1 301 0
GET /account/login?next=/myprofile/data/some_id/ HTTP/1.1 200 6533

Как мне написать свой тест? Это то, что я до сих пор:

self.client.login(user="user", password="passwd")
response = self.client.get('/myprofile/data/some_id/')
self.assertEqual(response.status,200)
self.client.logout()
response = self.client.get('/myprofile/data/some_id/')

что может быть дальше?

4b9b3361

Ответ 1

Django 1.4:

https://docs.djangoproject.com/en/1.4/topics/testing/#django.test.TestCase.assertRedirects

Django 1.7:

https://docs.djangoproject.com/en/1.7/topics/testing/tools/#django.test.SimpleTestCase.assertRedirects

SimpleTestCase.assertRedirects(response, expected_url, status_code=302, target_status_code=200, host=None, msg_prefix='', fetch_redirect_response=True)

Утверждается, что ответ возвратил статус перенаправления status_code, перенаправленный на expected_url (включая любые данные GET), и что последняя страница была полученный с помощью target_status_code.

Если ваш запрос использовал аргумент follow, expected_url и target_status_code будет URL-адрес и код состояния для конечной точки перенаправления цепь.

Аргумент хост устанавливает хост по умолчанию, если expected_url не включает его (например, "/bar/"). Если expected_url - абсолютный URL-адрес, содержащий хост (например, "http://testhost/bar/"), параметр хост будет проигнорирован. Обратите внимание: тестовый клиент не поддерживает выборку внешних URL-адресов, но этот параметр может быть полезен, если вы тестируете собственный HTTP-хост (например, инициализируя тестовый клиент Client (HTTP_HOST = "testhost" ).

Ответ 2

Вы также можете выполнить перенаправление с помощью:

response = self.client.get('/myprofile/data/some_id/', follow=True)

что отразило бы пользовательский опыт в браузере и сделало бы утверждения о том, что вы ожидаете найти там, например:

self.assertContains(response, "You must be logged in", status_code=401)

Ответ 3

Вы можете проверить response['Location'] и посмотреть, совпадает ли он с ожидаемым URL-адресом. Проверьте также, что код состояния равен 302.

Ответ 4

response['Location'] не существует в 1.9. Используйте это вместо:

response = self.client.get('/myprofile/data/some_id/', follow=True)
last_url, status_code = response.redirect_chain[-1]
print(last_url)