Модульное тестирование конечных точек REST в Django

Я новичок в Django и в веб-разработке в целом. Я решил учиться, создав простое веб-приложение для публикации и отображения отзывов о колледжах. У меня есть несколько конечных точек GET и POST, которые я хочу протестировать.

В прошлом я разрабатывал API-интерфейсы, в которых конечные точки возвращали объекты JSON, которые я мог утверждать при тестировании конечных точек API. Однако в этом случае мое приложение Django возвращает HTML.

Первая проблема, с которой я столкнулся, заключалась в том, что мой HTML иногда содержит динамические значения, которые я не могу утверждать. Например, csrf_token, который находится в моих формах. Вот часть HTML-файла для страницы с описанием университета:

...
<form action = "{% url 'university_add_review' university.id %}" method = "post">
    {% csrf_token %}
    <p>Date:</p><input type = "date" name = "date" id = "date"/>
    <p>Summary:</p><textarea name = "summary" id = "summary">Enter your summary here.</textarea>
    <input type = "submit" value = "Submit"/>
</form>
...

В своих модульных тестах я хочу проверить, что запрос GET на эту страницу получает правильное содержимое:

def test_get_university_details(self):
    response = Client().get('/%s/overview/' % self.university.id)

    self.assertEqual(response.content, expected)

Где expected - ожидаемый HTML. Однако это не удается, потому что csrf_token отличается в каждом запросе GET, поэтому у меня нет ожидаемого значения для него. В результате этот тест не проходит:

Traceback (most recent call last):
  File ".../tests.py", line 47, in test_get_university_details
    self.assertEqual(response.content, expected)
AssertionError: b'\n\[384 chars]ue=\'wrG24VMcdpYYOMECnibQrElP1km9YU0WeOMedGJ2C[488 chars]orm>' != b'\n\[384 chars]ue=\'QWCWACcNQwbfOx9M3iLFt77nSIKhUMiK5i1I4a5mD[530 chars]on> '

Итак, мои два вопроса:

  1. Какое решение для этого? Могу ли я игнорировать определенные части HTML?
  2. Является ли тестирование содержимого HTML хорошей практикой при тестировании приложений Django? Должен ли я вместо этого проводить тестирование по-другому?

Проверьте Главная тестовая страница Django Rest Framework. В нем есть несколько примеров, касающихся аутентификации и добавления поддержки использования формата html в тестовых запросах, которые могут вам помочь.

Aurora Wang 18.11.2018 20:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
590
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать self.assertContains(result, "abcd"), чтобы утверждать, что страница содержит заданную строку, как, например, показано здесь

Я не вижу ничего плохого в тестировании содержимого HTML. Ваши представления содержат логику, которая изменяет HTML. Ваши файлы .html также могут содержать логику шаблонов. Это необходимо протестировать вместе с другой частью вашего кода.

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