Джанго: Тестирование, если страница перенаправлена на нужный 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/')
что может быть дальше?
5 ответов
Джанго 1.4:
https://docs.djangoproject.com/en/1.4/topics/testing/
Джанго 2.0:
https://docs.djangoproject.com/en/2.0/topics/testing/tools/
SimpleTestCase.assertRedirects(response, expected_url, status_code=302, target_status_code=200, msg_prefix='', fetch_redirect_response=True)
Утверждает, что ответ возвратил статус перенаправления status_code, перенаправленный на Ожидаемый_урл (включая любые данные GET), и что последняя страница была получена с target_status_code.
Если в вашем запросе использовался следующий аргумент, Ожидаемые_url и target_status_code будут URL-адресом и кодом состояния для конечной точки цепочки перенаправления.
Если fetch_redirect_response имеет значение False, последняя страница не будет загружена. Так как тестовый клиент не может извлекать внешние URL-адреса, это особенно полезно, если ожидаемый_урл не является частью вашего приложения Django.
Схема обрабатывается правильно при сравнении двух URL. Если в месте, куда мы перенаправлены, не указано никакой схемы, используется схема исходного запроса. Если присутствует, схема в selected_url используется для сравнения.
Вы также можете выполнить перенаправление с помощью:
response = self.client.get('/myprofile/data/some_id/', follow=True)
который будет отражать пользовательский опыт в браузере и утверждать, что вы ожидаете найти там, например:
self.assertContains(response, "You must be logged in", status_code=401)
Ты можешь проверить response['Location']
и посмотрите, соответствует ли это ожидаемому URL. Проверьте также, что код состояния 302.
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)
Вы можете использовать assertRedirects, например:
response = self.client.get('/sekrit/')
self.assertRedirects(response, '/other/login/?next=/sekrit/')
Если вам нужно получить URL-адрес, который перенаправляет
Если есть
True
Вы получите URL в
response.redirect_chain[-1]
Если
follow
является
False
response.url