2013-05-31 66 views
1

如何在django中编写测试? 我阅读文档:https://docs.djangoproject.com/en/dev/topics/testing/overview/Django单元测试Sekizai和Django cms

但我们使用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'

关于此部分,我在我的TEMPLATE_CONTEXT_PROCESSORS中有sekizai.context_processors.sekizai

回答

3

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

这是令人困惑,因为我是在我的 模板正确使用sekizai。

这篇文章指出我在这里正确的方向。问题是 Django提出了一个例外,但我从来没有看到它 - 只是这个少得多的帮助信息。

这Stackoverflow帖子解释了如何启用错误记录。我将 复制到settings.py的更改中,将它们包装在if' '测试'语句中。

然后,当我跑

./manage.py测试

我得到了一个更加有用的错误信息:我忘了建立一个 表我的模板是假设将存在。轻松修复!

希望能帮助别人。

我需要添加一些灯具才能正常工作。

编辑: 好吧,经过大量的研究,我发现,尽管上述博客我有一个不同的问题。

由于这个答案,这个文档我知道我必须做这样的:

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 < =某种程度上这只是“最新的”可读

8.1 0.1。解决视图名称问题

您的应用需要测试,但在您的活动网站中,它们不在urls.py 中,因为它们连接到CMS页面。因此,如果您想在测试中使用 reverse()或使用url模板 标记的测试模板,则需要将应用程序连接到特定的测试版本urls.py ,并将测试告诉给使用它。

所以,你可以创建一个具有以下代码的myapp /测试/ test_urls.py:

从django.conf.urls django.contrib中导入管理导入网址, 模式,包括

URL模式=模式('', url(r'^ admin /',include(admin.site.urls)), url(r'^ myapp /',include('myapp.urls')), url(r'' ,包括('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 

如果你想测试你的 可以使用应用装饰到整个类:

from django.test.utils import override_settings from 个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上下文处理器的情况。