【问题标题】:Tests for extended DjangoCMS toolbar测试扩展的 DjangoCMS 工具栏
【发布时间】:2018-09-14 12:19:12
【问题描述】:

你能帮我如何在 DjangoCMS 中为扩展工具栏编写单元测试吗? 这是关于如何扩展工具栏的参考http://support.divio.com/academy/advanced-how-to-build-a-website-and-blog-with-django-cms/17-adapting-your-application

有人有这方面的经验吗? 提前致谢!

【问题讨论】:

标签: python django python-unittest django-cms


【解决方案1】:

经过一些研究并查看了 DjangoCMS 代码库,我设法编写了一些扩展 DjangoCMS 工具栏的测试。

如果您有页面的扩展名,例如models.py

class PageFieldExtension(PageExtension):
    subtitle = models.CharField(max_length=255, blank=True)
    background_image = FilerImageField(null=True, blank=True, 
    on_delete=models.SET_NULL)

extension_pool.register(PageFieldExtension)

并在cms_toolbar.py中填充工具栏菜单

@toolbar_pool.register
class PageFieldExtensionToolbar(ExtensionToolbar):

    model = PageFieldExtension

    def populate(self):
        # setup the extension toolbar with permissions and sanity checks
        current_page_menu = self._setup_extension_toolbar()
        # if its all ok
        if current_page_menu:
            # retrieves the instance of the current extension (if any)
            # and the toolbar item URL
            page_extension, url = self.get_page_extension_admin()
            if url:
                # adds separator
                current_page_menu.add_break()
                # adds a toolbar item
                current_page_menu.add_modal_item(
                    'Extra settings',
                    url=url,
                    disabled=not self.toolbar.edit_mode,
                )

您可以在页面工具栏中创建测试以检查 Extra settings 的存在性:

def test_existence_of_extra_settings(self):
    """
    Test if Extra settings appears in Page toolbar.
    """
    request = self.get_page_request(self.page, self.superuser, "/", edit=True)
    toolbar = CMSToolbar(request)
    page_item = self.get_page_item(toolbar)
    template_item = [item for item in page_item.items
                     if force_text(getattr(item, 'name', '')) == 'Extra settings...']

    self.assertEqual(len(template_item), 1)

测试页面扩展功能:

def test_page_extensions(self):
    """
    Test Page Extensions functionality.
    """
    request = self.get_page_request(self.page, self.superuser, "/", edit=True)
    extension = self.PageExtensionModel(subtitle="Extra settings subtitle", background_image=self.test_image,
                                        extended_object=self.page)
    extension.save()

    self.assertEqual(request.current_page.pagefieldextension.subtitle, "Extra settings subtitle")
    self.assertEqual(request.current_page.pagefieldextension.background_image, self.test_image)

在实际页面上测试页面扩展html解析(如果你正在使用它,显示一些字幕或背景图像):

def test_page_extensions_template(self):
    """
    Test Page Extensions html parsing.
    """
    extension = self.PageExtensionModel(subtitle="Extra settings subtitle", background_image=self.test_image,
                                        extended_object=self.page)
    extension.save()
    self.page.publish('en')

    self.client.logout()
    response = self.client.get(self.page.get_absolute_url())

    self.assertEqual(response.status_code, 200)

    expected_html = '<div><h1 class="title">Extra settings subtitle</h1></div>'           

    self.assertContains(response, expected_html, html=True)

    expected_html = '<div class="parallax" style="background: url(\'{}\')"></div>'.format(
        self.test_image.url)

    self.assertContains(response, expected_html, html=True)

这里有 get_page_requestget_page_item 方法,您也可以在 DjangoCMS 代码库中找到它们。

@staticmethod
def get_page_request(page, user, path=None, edit=False,
                     preview=False, structure=False, lang_code='en', disable=False):
    if not path:
        path = page.get_absolute_url()

    if edit:
        path += '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON')

    if structure:
        path += '?%s' % get_cms_setting('CMS_TOOLBAR_URL__BUILD')

    if preview:
        path += '?preview'

    request = RequestFactory().get(path)
    request.session = {}
    request.user = user
    request.LANGUAGE_CODE = lang_code
    if edit:
        request.GET = {'edit': None}
    else:
        request.GET = {'edit_off': None}
    if disable:
        request.GET[get_cms_setting('CMS_TOOLBAR_URL__DISABLE')] = None
    request.current_page = page
    mid = ToolbarMiddleware()
    mid.process_request(request)
    if hasattr(request, 'toolbar'):
        request.toolbar.populate()
    return request

@staticmethod
def get_page_item(toolbar):
    items = toolbar.get_left_items() + toolbar.get_right_items()
    page_item = [item for item in items if force_text(item.name) == 'Page']
    return page_item[0]

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多