2013-05-31 2 views
1

Как я могу написать тесты в django? Я прочитал документацию: https://docs.djangoproject.com/en/dev/topics/testing/overview/Jango unit testing Sekizai и 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. 

You должен включить «sekizai.context_processors.sekizai»

Что касается этой части, у меня есть sekizai.context_processors.sekizai в моем TEMPLATE_CONTEXT_PROCESSORS.

ответ

3

http://racingtadpole.com/blog/testing-django-cms-sites/

Это сбивает с толку, потому что я правильно используя sekizai в моем шаблоне.

Это сообщение направило меня в правильном направлении. Проблема была Django поднимал исключение, но я никогда не видел его - просто это гораздо менее полезное сообщение.

В этой статье Stackoverflow объясняется, как включить ведение журнала ошибок. I , скопированный в изменениях в settings.py, обертывание их внутри оператора if'test'.

Тогда, когда я побежал

./manage.py тест

Я получил сообщение гораздо больше полезной ошибки: я забыл создать таблицу, что мой шаблон предполагал бы существовать. Легко фиксируется!

Надеюсь, что это поможет кому-то еще.

Мне нужно было добавить некоторые приспособления для его работы.

EDIT: После много исследований выяснилось, что, несмотря на вышеупомянутый блог, у меня была другая проблема.

Благодаря этому ответу, и этот документ, я знал, что я должен был сделать это следующим образом:

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) 

How to unit test Django-CMS extensions? и http://docs.django-cms.org/en/latest/extending_cms/testing.html < = каким-то образом это читается только в «Lastest»

8,1 0,1. Разрешающие имена для просмотра

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

Таким образом, вы можете создать MYAPP/тесты/test_urls.py со следующим кодом:

из django.contrib импорта админ из django.conf.urls импорта URL-адрес, модели, включают в себя

urlpatterns = шаблоны ('', 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 conf на протяжении всего тестового класса, тогда вы можете использовать декоратор для всего класса:

от django.test.utils import 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 
2

Чтобы решить 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 контекст процессор используется во время рендеринга плагина.