2

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

4

2 回答 2

4

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

这很令人困惑,因为我在模板中正确使用了 sekizai。

这篇文章在这里为我指明了正确的方向。问题是 Django 引发了一个异常,但我从来没有看到它——只是这个不太有用的消息。

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

然后当我跑

./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)

如何对 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:

from django.contrib import admin from django.conf.urls import url, patterns, include

urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^myapp/', include('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
于 2013-06-21T13:45:31.243 回答
3

为了解决 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 上下文处理器的案例。

于 2014-11-07T19:27:17.067 回答