Django 单元测试 Sekizai 和 django cms

maa*_*zza 3 python django unit-testing django-cms django-sekizai

如何在 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)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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. 
Run Code Online (Sandbox Code Playgroud)

您必须启用“sekizai.context_processors.sekizai”

关于这部分我sekizai.context_processors.sekizai在我的TEMPLATE_CONTEXT_PROCESSORS.

maa*_*zza 5

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

\n\n
\n

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

\n\n

这篇文章为我指明了正确的方向。问题是\n Django 引发了一个异常,但我从未看到它\xe2\x80\x93\n 只是这条不太有用的消息。

\n\n

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

\n\n

然后当我跑的时候

\n\n

./manage.py测试

\n\n

我收到了一条更有用的错误消息:我忘记设置一个我的模板假设存在的表。轻松修复!

\n\n

希望对其他人有帮助。

\n
\n\n

我需要添加一些固定装置才能使其工作。

\n\n

编辑:\n好吧,经过大量研究,我发现尽管有上述博客,但我遇到了不同的问题。

\n\n

感谢这个答案和这个文档,我知道我必须这样做:

\n\n
from django.test import TestCase\nfrom django.test.client import Client\nfrom cms.test_utils.testcases import CMSTestCase\nfrom django.test.utils import override_settings\nfrom cms.models import Page\nfrom django.contrib import admin\nfrom django.conf.urls import url, patterns, include\nfrom django.conf import settings\n\nurlpatterns = patterns(\'\',\n    url(r\'^admin/\', include(admin.site.urls)),\n    url(r\'^search_engine/\', include(\'search_engine.urls\')),\n    url(r\'\', include(\'cms.urls\')),\n)\n\n\nclass AccessTest(CMSTestCase):\n\n    def setUp(self):\n        # Every test needs a client.\n        p = Page.objects.create(site_id=settings.SITE_ID, template=\'home_page.html\')\n        p.publish()\n        self.client = Client()\n\n    @override_settings(ROOT_URLCONF=\'search_engine.tests\')\n    def test_details(self):\n        # Issue a GET request.\n        response = self.client.get(\'/\')\n\n        # Check that the response is 200 OK.\n        self.assertEqual(response.status_code, 200)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何对 Django-CMS 扩展进行单元测试?\nand http://docs.django-cms.org/en/latest/extending_cms/testing.html <= 不知何故,这只能在“最新”中读取

\n\n
\n

8.1.1. 解析视图名称

\n\n

您的应用程序需要测试,但在您的实时站点中,它们在 urls.py\n 中\xe2\x80\x99t,因为它们附加到 CMS 页面。因此,如果您希望能够在测试中使用\n reverse(),或者测试使用 url 模板\n 标签的模板,则需要将您的应用程序连接到 urls.py\n 的特殊测试版本\n 并告诉你的测试来使用它。

\n\n

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

\n\n

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

\n\n

urlpatterns = 模式(\'\',\n url(r\'^admin/\', include(admin.site.urls)),\n url(r\'^myapp/\', include(\'myapp .urls\')),\n url(r\'\', include(\'cms.urls\')), )

\n\n

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

\n\n

从 django.test.utils 导入 o​​verride_settings from\n cms.test_utils.testcases 导入 CMSTestCase

\n\n

类 MyappTests(CMSTestCase):

\n\n
@override_settings(ROOT_URLCONF=\'myapp.tests.test_urls\')\ndef test_myapp_page(self):\n    test_url = reverse(\'myapp_view_name\')\n    # rest of test as normal\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想在整个测试类中使用测试 url conf,那么您可以使用将装饰器应用于整个类:

\n\n

从 django.test.utils 导入 o​​verride_settings from\n cms.test_utils.testcases 导入 CMSTestCase

\n\n

@override_settings(ROOT_URLCONF=\'myapp.tests.test_urls\') 类\n MyappTests(CMSTestCase):

\n\n
def test_myapp_page(self):\n    test_url = reverse(\'myapp_view_name\')\n    # rest of test as normal\n
Run Code Online (Sandbox Code Playgroud)\n
\n