Как тестировать свои расширения

Тестирование приложений

Разрешение имен представлений

Ваши приложения нуждаются в тестировании, но на вашем живом сайте они не находятся в urls.py, поскольку они прикреплены к странице CMS. Поэтому если вы хотите иметь возможность использовать reverse() в ваших тестах или тестировать шаблоны, использующие тег шаблона url, вам нужно подключить ваше приложение к специальной тестовой версии urls.py и сказать вашим тестам использовать ее.

Таким образом, вы можете создать myapp/tests/urls.py с помощью следующего кода:

from django.contrib import admin
from django.urls import re_path, include

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'^myapp/', include('myapp.urls')),
    re_path(r'', include('cms.urls')),
]

А затем в своих тестах вы можете подключить это с помощью декоратора override_settings():

from django.test.utils import override_settings
from cms.test_utils.testcases import CMSTestCase

class MyappTests(CMSTestCase):

    @override_settings(ROOT_URLCONF='myapp.tests.urls')
    def test_myapp_page(self):
        test_url = reverse('myapp_view_name')
        # rest of test as normal

Если вы хотите, чтобы тестовый url conf присутствовал во всем вашем тестовом классе, то вы можете применить декоратор ко всему классу:

from django.test.utils import override_settings
from cms.test_utils.testcases import CMSTestCase

@override_settings(ROOT_URLCONF='myapp.tests.urls')
class MyappTests(CMSTestCase):

    def test_myapp_page(self):
        test_url = reverse('myapp_view_name')
        # rest of test as normal

CMSTestCase

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

Тестирование плагинов

Чтобы протестировать плагины, необходимо назначить их на placeholder. В зависимости от того, на каком уровне вы хотите проверить свой плагин, вы можете проверить либо HTML, сгенерированный им, либо контекст, предоставленный его шаблону:

from django.test import TestCase
from django.test.client import RequestFactory

from cms.api import add_plugin
from cms.models import Placeholder
from cms.plugin_rendering import ContentRenderer

from myapp.cms_plugins import MyPlugin
from myapp.models import MyappPlugin

class MypluginTests(TestCase):
    def test_plugin_context(self):
        placeholder = Placeholder.objects.create(slot='test')
        model_instance = add_plugin(
            placeholder,
            MyPlugin,
            'en',
        )
        plugin_instance = model_instance.get_plugin_class_instance()
        context = plugin_instance.render({}, model_instance, None)
        self.assertIn('key', context)
        self.assertEqual(context['key'], 'value')

    def test_plugin_html(self):
        placeholder = Placeholder.objects.create(slot='test')
        model_instance = add_plugin(
            placeholder,
            MyPlugin,
            'en',
        )
        renderer = ContentRenderer(request=RequestFactory())
        html = renderer.render_plugin(model_instance, {})
        self.assertEqual(html, '<strong>Test</strong>')
Вернуться на верх