Как тестировать свои расширения¶
Тестирование приложений¶
Разрешение имен представлений¶
Ваши приложения нуждаются в тестировании, но на вашем живом сайте они не находятся в 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>')