Как тестировать многократно используемые шаблоны Django?
В одном из моих шаблонов для детального просмотра назначения устройства у меня была логика, относящаяся к тому, должны ли появляться кнопки в зависимости от разрешения пользователя. Я написал тесты для этих кнопок, и они работают как ожидалось.
Сегодня я хотел повторно использовать эти кнопки в другом шаблоне, поэтому я извлек их в собственный файл шаблона и поместил его в папку "partials".
|-templates
| |-assignments
| | |-deviceassignment_form.html
| | |-deviceassignment_detail.html
| | |-deviceassignment_confirm_delete.html
| | |-deviceassignment_list.html
| | |-partials
| | | |-deviceassignment_control_buttons.html
| | | |-deviceassignment_infobox.html
Очевидно, что я могу продолжать тестировать deviceassignment_detail.html, который включает кнопки управления и проверяет, работают ли они (появляются или нет в зависимости от разрешений). Но потом, когда я включу кнопки управления в другое место, у меня может возникнуть соблазн проверить их снова...
Не могу ли я вместо этого написать тест ТОЛЬКО для шаблона deviceassignment_control_buttons.html? Я хочу отобразить шаблон непосредственно с базовым контекстом представления и проверить, что все работает так, как ожидается. Возможно ли это?
Наконец-то я нашел видео, которое объясняет это. Вот ответ для тех, кто столкнется с этим в будущем. Я использую Beautiful Soup, чтобы легко проверить, что определенные элементы в ссылках, которые я ищу, действительно существуют. Я создаю контекст, чтобы соответствовать тому, какие разрешения будут доступны шаблону.
from django.test import SimpleTestCase
from django.template import Context, Template
from bs4 import BeautifulSoup
import copy
list_link_selector = 'a[href="/assignments/"]'
update_link_selector = 'a[href="/assignments/1/edit/"]'
delete_link_selector = 'a[href="/assignments/1/delete/"]'
default_context = Context(
{
"deviceassignment": {"id": 1},
"perms": {
"assignments": {
"view_deviceassignment": True,
"delete_deviceassignment": True,
"change_deviceassignment": True,
}
},
}
)
default_template = Template(
"{% include 'assignments/partials/deviceassignment_control_buttons.html'%}"
)
class DeviceAssignmentControlButtonsSuperuserTest(SimpleTestCase):
def test_all_links_exist(self):
context = copy.deepcopy(default_context)
template = copy.deepcopy(default_template)
rendered = template.render(context)
soup = BeautifulSoup(rendered, "html.parser")
list_link = soup.select(list_link_selector)
update_link = soup.select(update_link_selector)
delete_link = soup.select(delete_link_selector)
self.assertEqual(len(list_link), 1)
self.assertEqual(len(update_link), 1)
self.assertEqual(len(delete_link), 1)
self.assertEqual(list_link[0].contents[0], "Assignment List")
self.assertEqual(update_link[0].contents[0], "Edit Assignment")
self.assertEqual(delete_link[0].contents[0], "Delete Assignment")