扩展DjangoCMS工具b的测试

2024-04-29 14:03:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

有人有过这样的经验吗? 提前谢谢!你知道吗


Tags: andtobuildcomhttpsupportdjangocmsblog
1条回答
网友
1楼 · 发布于 2024-04-29 14:03:51

经过一些研究并查看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]

相关问题 更多 >