Как выполнить перенаправление 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, от которого он наследует ( делает запросы).

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