Джанго: Тестирование, если страница перенаправлена ​​на нужный 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/')

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

Если вам нужно получить URL-адрес, который перенаправляет

Если есть True

Вы получите URL в

      response.redirect_chain[-1]

Если followявляется False

      response.url
Другие вопросы по тегам