Настройка HttpReferrer в модульных тестах - PullRequest
0 голосов
/ 28 мая 2020

В моем view.py у меня есть следующая проверка на нескольких последовательных страницах:

if(request.META.get('HTTP_REFERER') != request.build_absolute_uri(reverse('page1'))):
            return redirect('page1')

Это выполняется на каждой странице, проверяя, был ли пользователь перенаправлен с предыдущей страницы, поэтому (например) , если пользователь попытается ввести URL-адрес страницы 4 в адресной строке, тест завершится неудачно, и он будет отправлен на страницу 3, тогда проверка страниц завершится неудачно, и он вернется на страницу 2 и т. д.

Я делаю это, потому что у меня есть несколько связанных страниц, которые пользователи должны посещать последовательно.

Проблема возникает, когда я хочу выполнить модульное тестирование. Следующий тест выдает ошибку, потому что он не проходит тест перенаправления и, следовательно, не может проверить logi c страницы, которую я пытаюсь проверить:

def test_user_information_updated_on_validation_success(self):
        user = User.objects.create_superuser('username')
        self.client.force_login(user)

        self.client.post(reverse('page_4'), {
            'exampleQuestion': 'exampleAnswer'
        })
        user.refresh_from_db()

        self.assertEqual(user.exampleform.somefield, 'exampleAnswer')

Как я могу получить доступ к странице в модульном тесте как если бы он был перенаправлен.

Спасибо.

1 Ответ

3 голосов
/ 30 мая 2020

Запрос в тестовом клиенте принимает ключевые слова, сопоставленные с переменными среды WSGI. Переменные среды, начинающиеся с HTTP и все в верхнем регистре, с дефисами, сопоставленными с подчеркиваниями - это заголовки Http, поэтому короткая версия заключается в том, что мы можем установить заголовки HTTP как таковые:

# Wrong: Generates absolute paths without hosts
self.client.post(
    reverse('page_4'), {'exampleQuestion': 'exampleAnswer'},
    HTTP_REFERER=reverse('page_3')
)

Изменить: это слишком просто, потому что рефереры HTTP полностью квалифицированы, поэтому нам нужно:


referer = 'http://testserver{}'.format(reverse('page_3'))
self.client.post(
    reverse('page_4'), {'exampleQuestion': 'exampleAnswer'},
    HTTP_REFERER=referer
)

FYI: протокол (wsgi.scheme) и имя хоста (HTTP_SERVER) происходят из djang.test.client.RequestFactory._base_environ(). Если вы используете модифицированный клиент, который меняет имя сервера и / или протокол, вам следует внести соответствующие изменения. В этом случае было бы разумно переопределить _base_environ в вашем модифицированном тестовом клиенте и получить из него значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...