Джанго юнит тестирование Секизай и Джанго 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.

Другие вопросы по тегам