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/')
что может быть дальше?
Ответы
Ответ 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)