Spec-Zone.ru › Wagtail

Тестирование вашего сайта Wagtail

Wagtail поставляется с некоторыми утилитами, которые упрощают написание тестов для вашего сайта.

WagtailPageTestCase

class wagtail.test.utils.WagtailPageTestCase WagtailPageTestCase extends django.test.TestCase, добавляя несколько новых assert методов. Вы должны расширить этот класс, чтобы использовать его методы:

from wagtail.test.utils import WagtailPageTestCase
from myapp.models import MyPage

class MyPageTests(WagtailPageTestCase):
    def test_can_create_a_page(self):
        ...

assertPageIsRoutable(page, route_path=”/”, msg=None)

Утверждает, что page может быть перенаправлен без повышения Http404 ошибки.

Для типов страниц с несколькими маршрутами можно использовать route_path для указания альтернативного маршрута для тестирования.

Это утверждение отлично подходит для получения покрытия по пользовательской логике маршрутизации для типов страниц. Вот пример:

from wagtail.test.utils import WagtailPageTestCase
from myapp.models import EventListPage

class EventListPageRoutabilityTests(WagtailPageTestCase):
    @classmethod
    def setUpTestData(cls):
        # create page(s) for testing
        ...

    def test_default_route(self):
        self.assertPageIsRoutable(self.page)

    def test_year_archive_route(self):
        # NOTE: Despite this page type raising a 404 when no events exist for
        # the specified year, routing should still be successful
        self.assertPageIsRoutable(self.page, "archive/year/1984/")

assertPageIsRenderable(page, route_path=”/”, query_data=None, post_data=None, user=None, accept_404=False, accept_redirect=False, msg=None)

Утверждает, что page может быть отображен без повышения фатальной ошибки.

Для типов страниц с несколькими маршрутами можно использовать route_path для указания частичного пути, который будет добавлен к обычному url пути страницы.

Когда post_data предоставляется, тест выполняет POST запрос с post_data в теле запроса. В противном случае выполняется GET запрос.

Если предоставлены, query_data всегда преобразуются в строку запроса и добавляются к URL запроса.

Если предоставлен user, тест проводится с ним как активным пользователем.

По умолчанию утверждение будет отклонено, если запрос к URL страницы приводит к HTTP-ответу 301, 302 или 404. Если вы тестируете страницу/маршрут, где ожидается ответ 404, можно использовать accept_404=True, чтобы указать это, и утверждение пройдет при получении ответа 404. Аналогично, если вы тестируете страницу/маршрут, где ожидается перенаправление, можно использовать accept_redirect=True, чтобы указать это, и утверждение пройдет при получении ответа 301 или 302.

Это утверждение отлично подходит для получения покрытия по пользовательской логике рендеринга для типов страниц. Вот пример:

def test_default_route_rendering(self):
    self.assertPageIsRenderable(self.page)

def test_year_archive_route_with_zero_matches(self):
    # NOTE: Should raise a 404 when no events exist for the specified year
    self.assertPageIsRenderable(self.page, "archive/year/1984/", accept_404=True)

def test_month_archive_route_with_zero_matches(self):
    # NOTE: Should redirect to year-specific view when no events exist for the specified month
    self.assertPageIsRenderable(self.page, "archive/year/1984/07/", accept_redirect=True)

assertPageIsEditable(page, post_data=None, user=None, msg=None)

Утверждает, что просмотр редактирования страницы работает для page без повышения фатальной ошибки.

Если предоставлен user, тест проводится с ним как активным пользователем. В противном случае создается и используется суперпользователь для теста.

После успешного GET запроса выполняется POST запрос с данными поля в теле запроса. Если post_data предоставлены, они будут использованы для этой цели. Если нет, эти данные будут извлечены из GET ответа HTML.

Это утверждение отлично подходит для получения покрытия по пользовательским полям, настройке панели и пользовательской логике валидации. Вот пример:

def test_editability(self):
    self.assertPageIsEditable(self.page)

def test_editability_on_post(self):
    self.assertPageIsEditable(
        self.page,
        post_data={
            "title": "Fabulous events",
            "slug": "events",
            "show_featured": True,
            "show_expired": False,
            "action-publish": "",
        }
    )

assertPageIsPreviewable(page, mode=””, post_data=None, user=None, msg=None)

Утверждает, что просмотр предварительного просмотра страницы может быть загружен для page без повышения фатальной ошибки.

Для типов страниц, которые поддерживают разные режимы предварительного просмотра, можно использовать mode для указания режима предварительного просмотра, который нужно протестировать.

Если предоставлен user, тест проводится с ним как активным пользователем. В противном случае создается и используется суперпользователь для теста.

Для загрузки предварительного просмотра клиенту теста необходимо выполнить POST запрос, содержащий все необходимые данные поля в теле запроса. Если post_data предоставлены, они будут использованы для этой цели. В противном случае метод попытается извлечь эти данные из просмотра редактирования страницы.

Это утверждение отлично подходит для получения покрытия по пользовательским режимам предварительного просмотра или получения гарантии, что пользовательская логика рендеринга совместима с режимом предварительного просмотра Wagtail. Вот пример:

def test_general_previewability(self):
    self.assertPageIsPreviewable(self.page)

def test_archive_previewability(self):
    self.assertPageIsPreviewable(self.page, mode="year-archive")

assertCanCreateAt(parent_model, child_model, msg=None) Утверждает, что определенный тип дочерней страницы может быть создан под родительской страницей. parent_model и child_model должны быть классами страниц, которые тестируются.

def test_can_create_under_home_page(self):
    # You can create a ContentPage under a HomePage
    self.assertCanCreateAt(HomePage, ContentPage)

assertCanNotCreateAt(parent_model, child_model, msg=None) Утверждает, что определенный тип дочерней страницы не может быть создан под родительской страницей. parent_model и child_model должны быть классами страниц, которые тестируются.

def test_cant_create_under_event_page(self):
    # You can not create a ContentPage under an EventPage
    self.assertCanNotCreateAt(EventPage, ContentPage)

assertCanCreate(parent, child_model, data, msg=None) Утверждает, что дочерний элемент данного типа страницы может быть создан под родительским элементом, используя предоставленные данные POST.

parent должен быть экземпляром страницы, а child_model должен быть подклассом страницы. data должен быть словарем, который будет отправлен в метод создания страницы Wagtail admin.

from wagtail.test.utils.form_data import nested_form_data, streamfield

def test_can_create_content_page(self):
    # Get the HomePage
    root_page = HomePage.objects.get(pk=2)

    # Assert that a ContentPage can be made here, with this POST data
    self.assertCanCreate(root_page, ContentPage, nested_form_data({
        'title': 'About us',
        'body': streamfield([
            ('text', 'Lorem ipsum dolor sit amet'),
        ])
    }))

См. Справочные данные формы для набора функций, полезных для построения данных POST.

assertAllowedParentPageTypes(child_model, parent_models, msg=None) Проверка того, что единственные типы страниц, под которыми child_model может быть создан, являются parent_models.

Список разрешенных родительских моделей может отличаться от заданного в Page.parent_page_types, если родительские модели установили Page.subpage_types.

def test_content_page_parent_pages(self):
    # A ContentPage can only be created under a HomePage
    # or another ContentPage
    self.assertAllowedParentPageTypes(
        ContentPage, {HomePage, ContentPage})

    # An EventPage can only be created under an EventIndex
    self.assertAllowedParentPageTypes(
        EventPage, {EventIndex})

assertAllowedSubpageTypes(parent_model, child_models, msg=None) Проверка того, что единственные типы страниц, которые могут быть созданы под parent_model — это child_models.

Список разрешенных дочерних моделей может отличаться от заданного в Page.subpage_types, если дочерние модели установили Page.parent_page_types.

def test_content_page_subpages(self):
    # A ContentPage can only have other ContentPage children
    self.assertAllowedSubpageTypes(
        ContentPage, {ContentPage})

    # A HomePage can have ContentPage and EventIndex children
    self.assertAllowedSubpageTypes(
        HomePage, {ContentPage, EventIndex})

Справочные данные формы

Метод assertCanCreate требует, чтобы данные страницы передавались в том же формате, в котором страница отправляла бы форму редактирования. Для сложных типов страниц вручную создать эту структуру данных может быть сложно; модуль wagtail.test.utils.form_data предоставляет набор вспомогательных функций для помощи в этом.

Фикстуры

Использование dumpdata

Создание фикстур для тестов лучше всего выполнять, создав контент в тестовой среде и используя команду Django dumpdata.

Обратите внимание, что по умолчанию dumpdata будет представлять content_type первичным ключом; это может вызвать проблемы с согласованностью при добавлении/удалении моделей, поскольку типы содержимого заполняются отдельно от фикстур. Чтобы предотвратить это, используйте переключатель --natural-foreign, который представляет типы содержимого по ["app", "model"] вместо этого.

Ручная модификация

Вы можете вручную изменить созданные фикстуры или даже написать их все вручную. Вот несколько моментов, на которые следует обратить внимание.

Пользовательские модели страниц

При создании настраиваемых моделей страниц в фикстурах вам необходимо добавить запись wagtailcore.page и одну для вашей настраиваемой модели страницы.

Предположим, у вас есть модуль website, который определяет класс Homepage(Page). Вы можете создать такую домашнюю страницу в фикстуре с помощью:

[
    {
        "model": "wagtailcore.page",
        "pk": 3,
        "fields": {
            "title": "My Customer's Homepage",
            "content_type": ["website", "homepage"],
            "depth": 2
        }
    },
    {
        "model": "website.homepage",
        "pk": 3,
        "fields": {}
    }
]

Поля Treebeard

Заполнение полей path / numchild / depth необходимо для правильной работы операций с деревом, таких как get_parent(). url_path — это еще одно поле, которое в некоторых редких случаях может вызвать ошибки, если оно не заполнено.

Документация Treebeard может помочь в понимании этого.

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/stable/advanced_topics/testing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API