Как выполнить перенаправление Django с помощью django-pytest?
При настройке ArchiveIndexView в Django я могу успешно отобразить список элементов в модели, перейдя на страницу самостоятельно.
Когда вы собираетесь написать тест в pytest, чтобы убедиться, что переход на страницу "checklist_GTD/archive/" завершился успешно, тест завершается неудачно с сообщением:
> assert response.status_code == 200
E assert 301 == 200
E + where 301 = <HttpResponsePermanentRedirect status_code=301, "text/html; charset=utf-8", url="/checklist_GTD/archive/">.status_code
test_archive.py:4: AssertionError
Я понимаю, что есть способ выполнить запрос, чтобы получить окончательный код status_code. Может кто-нибудь помочь мне с тем, как это делается в pytest-django, аналогично этому вопросу? Документация по pytest-django не имеет ничего о перенаправлениях. Благодарю.
2 ответа
Отвечая на мой собственный вопрос здесь. Я решил включить окончательный ожидаемый URL, используя встроенную среду тестирования Django. assertRedirects
и убедитесь, что он (1) перенаправляется изначально с 302
ответ и (2) в конечном итоге успешно с кодом 200
по ожидаемому URL.
from django.test import TestCase, Client
def test_pytest_works():
assert 1==1
class Test(TestCase):
def test_redirect(self):
client = Client()
response = client.get("/checklist_GTD/archive/")
self.assertRedirects(response, "/expected_redirect/url", 302, 200)
Шляпа подсказка @tdsymonds, чтобы указать мне в правильном направлении. Я оценил ответ Шекера, но в некоторых сценариях я видел результат перенаправления 200
когда страница перенаправляется на нежелательный URL. С помощью решения, приведенного выше, я могу применить URL-адрес перенаправления, который pytest-django в настоящее время не поддерживает.
Обратите внимание: этот ответ соответствует функции автоматического обнаружения pytest-django
и, таким образом, не является несовместимым (он автоматически обнаруживает тесты pytest-django и Django TestCase).
pytest-django предоставляет как не прошедший проверку подлинности client
и вошли в систему admin_client
в качестве светильников. Действительно упрощает такие вещи. Предполагая на данный момент, что вы используете admin_client
потому что вы просто хотите проверить перенаправление как можно проще, без необходимости входа вручную:
def test_something(admin_client):
response = admin_client.get(url, follow=True)
assert response.status_code == 200
Если вы хотите войти обычным пользователем:
def test_something(client):
# Create user here, then:
client.login(username="foo", password="bar")
response = client.get(url, follow=True)
assert response.status_code == 200
Используя follow=True
в любом из них response.status_code
будет равен коду возврата страницы после перенаправления, а не доступа к исходному URL. Следовательно, оно должно разрешаться до 200, а не 301.
Я думаю, что это не задокументировано в pytest-django, потому что опция унаследована от тестового клиента Django, от которого он наследует ( делает запросы).