【问题标题】:Django unit testing Sekizai and django cmsDjango 单元测试 Sekizai 和 django cms
【发布时间】:2013-05-27 10:36:45
【问题描述】:

如何在 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”

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

【问题讨论】:

    标签: python django unit-testing django-cms django-sekizai


    【解决方案1】:

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

    这很令人困惑,因为我在我的 模板。

    这篇文章为我指明了正确的方向。问题是 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.1。解析视图名称

    您的应用需要测试,但在您的实际站点中,它们不在 urls.py 中 因为它们附加到 CMS 页面。所以如果你想能够使用 reverse() 在您的测试中,或使用 url 模板的测试模板 标签,您需要将您的应用程序连接到 urls.py 的特殊测试版本 并告诉你的测试使用它。

    因此您可以使用以下代码创建 myapp/tests/test_urls.py:

    from django.contrib import admin from django.conf.urls import url, 模式,包括

    urlpatterns = 模式('', 网址(r'^admin/',包括(admin.site.urls)), 网址(r'^myapp/',包括('myapp.urls')), url(r'', 包括('cms.urls')), )

    然后在您的测试中,您可以使用 override_settings() 装饰器:

    从 django.test.utils 导入 o​​verride_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 导入 o​​verride_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 上下文处理器的案例。

      【讨论】:

        猜你喜欢
        • 2011-02-07
        • 1970-01-01
        • 2012-11-27
        • 2019-04-27
        • 1970-01-01
        • 2013-03-13
        • 2017-10-19
        • 2021-04-08
        • 2017-12-19
        相关资源
        最近更新 更多