Джанго юнит тестирование Секизай и Джанго cms
Как я могу написать тесты в Django? Я читаю документацию: https://docs.djangoproject.com/en/dev/topics/testing/overview/
Но мы используем django-cms и sekizai, поэтому, когда я делаю простой тест вроде:
from django.test import TestCase
from django.test.client import Client
class AccessTest(TestCase):
def setUp(self):
# Every test needs a client.
self.client = Client()
def test_details(self):
# Issue a GET request.
response = self.client.get('/')
# Check that the response is 200 OK.
self.assertEqual(response.status_code, 200)
Я получаю эту ошибку:
Traceback (most recent call last): File "/home/maazza/PycharmProjects/django_my_app/search_engine/tests.py", line 18, in test_details
response = self.client.get('/') File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/test/client.py", line 439, in get
response = super(Client, self).get(path, data=data, **extra) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/test/client.py", line 244, in get
return self.request(**r) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/test/client.py", line 381, in request
response = self.handler(environ) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/test/client.py", line 84, in __call__
response = self.get_response(request) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 153, in get_response
response = self.handle_uncaught_exception(request, resolver, sys.exc_info()) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 228, in handle_uncaught_exception
return callback(request, **param_dict) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/utils/decorators.py", line 91, in _wrapped_view
response = view_func(request, *args, **kwargs) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/views/defaults.py", line 33, in server_error
return http.HttpResponseServerError(t.render(Context({}))) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/template/base.py", line 140, in render
return self._render(context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/test/utils.py", line 62, in instrumented_test_render
return self.nodelist.render(context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/template/base.py", line 823, in render
bit = self.render_node(node, context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/template/debug.py", line 74, in render_node
return node.render(context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 123, in render
return compiled_parent._render(context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/test/utils.py", line 62, in instrumented_test_render
return self.nodelist.render(context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/template/base.py", line 823, in render
bit = self.render_node(node, context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/template/debug.py", line 74, in render_node
return node.render(context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 123, in render
return compiled_parent._render(context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/test/utils.py", line 62, in instrumented_test_render
return self.nodelist.render(context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/template/base.py", line 823, in render
bit = self.render_node(node, context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/django/template/debug.py", line 74, in render_node
return node.render(context) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/classytags/core.py", line 106, in render
return self.render_tag(context, **kwargs) File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/sekizai/templatetags/sekizai_tags.py", line 74, in render_tag
if not validate_context(context): File "/home/maazza/.virtualenvs/django_my_app/local/lib/python2.7/site-packages/sekizai/templatetags/sekizai_tags.py", line 28, in validate_context
"You must enable the 'sekizai.context_processors.sekizai' template " TemplateSyntaxError: You must enable the 'sekizai.context_processors.sekizai' template context processor or use 'sekizai.context.SekizaiContext' to render your templates.
Вы должны включить 'sekizai.context_processors.sekizai'
Что касается этой части, у меня есть sekizai.context_processors.sekizai
в моем TEMPLATE_CONTEXT_PROCESSORS
,
2 ответа
http://racingtadpole.com/blog/testing-django-cms-sites/
Это сбивало с толку, потому что я правильно использовал sekizai в своем шаблоне.
Этот пост указал мне в правильном направлении здесь. Проблема была в том, что Джанго выдвигал исключение, но я так и не увидел его - только это гораздо менее полезное сообщение.
В этом посте Stackru объясняется, как включить ведение журнала ошибок. Я скопировал изменения в settings.py, обернув их внутри оператора if 'test'.
Затем, когда я побежал
./manage.py test
Я получил гораздо более полезное сообщение об ошибке: я забыл настроить таблицу, которая, как предполагал мой шаблон, существует. Легко исправляется!
Надеюсь, что это помогает кому-то еще.
Мне нужно было добавить некоторые приспособления для его работы.
РЕДАКТИРОВАТЬ: Хорошо после многих исследований я обнаружил, что, несмотря на вышеупомянутый блог, у меня была другая проблема.
Благодаря этому ответу и этому документу я знал, что должен был сделать это так:
from django.test import TestCase
from django.test.client import Client
from cms.test_utils.testcases import CMSTestCase
from django.test.utils import override_settings
from cms.models import Page
from django.contrib import admin
from django.conf.urls import url, patterns, include
from django.conf import settings
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^search_engine/', include('search_engine.urls')),
url(r'', include('cms.urls')),
)
class AccessTest(CMSTestCase):
def setUp(self):
# Every test needs a client.
p = Page.objects.create(site_id=settings.SITE_ID, template='home_page.html')
p.publish()
self.client = Client()
@override_settings(ROOT_URLCONF='search_engine.tests')
def test_details(self):
# Issue a GET request.
response = self.client.get('/')
# Check that the response is 200 OK.
self.assertEqual(response.status_code, 200)
Как выполнить модульное тестирование расширений Django-CMS? и http://docs.django-cms.org/en/latest/extending_cms/testing.html <= как-то это читается только в "последних"
8.1.1. Разрешение просмотра имен
Ваши приложения нуждаются в тестировании, но на вашем реальном сайте они не находятся в urls.py, поскольку они прикреплены к странице CMS. Поэтому, если вы хотите иметь возможность использовать reverse() в своих тестах или тестовые шаблоны, использующие тег шаблона url, вам нужно подключить ваше приложение к специальной тестовой версии urls.py и указать своим тестам, чтобы она использовалась.
Таким образом, вы можете создать myapp / tests / test_urls.py с помощью следующего кода:
из django.contrib администратор импорта из django.conf.urls URL импорта, шаблоны, включают
urlpatterns = pattern ('', url(r'^admin/', include(admin.site.urls)), url(r'^myapp/', include('myapp.urls'))), url(r'', include('cms.urls')),)
И затем в ваших тестах вы можете подключить это с помощью декоратора override_settings():
из django.test.utils импорт override_settings из cms.test_utils.testcases импорт CMSTestCase
Класс MyappTests(CMSTestCase):
@override_settings(ROOT_URLCONF='myapp.tests.test_urls') def test_myapp_page(self): test_url = reverse('myapp_view_name') # rest of test as normal
Если вы хотите проверить URL-адрес test во всем классе теста, то вы можете использовать применить декоратор ко всему классу:
из django.test.utils импорт override_settings из cms.test_utils.testcases импорт CMSTestCase
@override_settings (ROOT_URLCONF = 'myapp.tests.test_urls') класс MyappTests(CMSTestCase):
def test_myapp_page(self): test_url = reverse('myapp_view_name') # rest of test as normal
Чтобы решить ошибку sekizai, вот что я сделал:
from django.test import TestCase
from sekizai.context import SekizaiContext
from cms.api import add_plugin
from cms.models import Placeholder
# Put class def here
def test_plugin(self):
placeholder = Placeholder.objects.create(slot='test')
model_inst = add_plugin(placeholder,
cms_plugins.MyPlugin, 'en')
context = SekizaiContext()
html = model_inst.render_plugin(context=context)
self.assertTrue(len(html) > 0)
Это был случай, когда во время рендеринга плагина использовался контекстный процессор seikizai.