Как тестировать многократно используемые шаблоны 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")
Вернуться на верх