繁体   English   中英

如何测试进行重定向的辅助Grok视图

[英]How to test a helper Grok view that makes a redirect

我有一个内容类型,需要在调用助手Grok视图后进行某种方式的修改,该视图检查某些条件,进行一些更改,设置一条消息并重定向到原始对象。

我的助手视图只有一个render方法,我想为此编写一些测试,但我不知道如何处理。

我想在不满足某些条件时检查错误消息,并在一切正常时检查信息消息。

我的代码如下所示:

class MyHelperView(grok.View):

    grok.context(IMyType)
    grok.layer(IMyLayer)
    grok.name('helper-view')
    grok.require('my.permission')

    def render(self):
        variable = self.request.form.get('variable', None)
        if not variable:
            msg = _(u'Required input is missing.')
            api.portal.show_message(message=msg, request=self.request, type='error')
        else:
            do_something()
            msg = _(u'Information processed.')
            api.portal.show_message(message=msg, request=self.request)
        self.request.response.redirect(self.context.absolute_url())

当我显然调用视图时,我以None对象结束,因为视图不返回任何内容。 我不知道在哪里寻找邮件...要求? 响应? 有什么提示吗?

我最后进行了基于FunctionalTesting的测试:

....
from plone.app.testing import TEST_USER_NAME
from plone.app.testing import TEST_USER_PASSWORD
from plone.testing.z2 import Browser
....

import transaction
...


class HelperViewTestCase(unittest.TestCase):

    layer = FUNCTIONAL_TESTING

    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.request = self.layer['request']
        directlyProvides(self.request, IMyLayer)

        with api.env.adopt_roles(['Manager']):
            self.foo = api.content.create(self.portal, 'MyType', 'foo')

        transaction.commit()

    def test_response(self):
        browser = Browser(self.app)
        browser.handleErrors = False
        browser.addHeader(
            'Authorization',
            'Basic {0}:{1}'.format(TEST_USER_NAME, TEST_USER_PASSWORD)
        )
        browser.open(self.foo.absolute_url())
        browser.getControl('Do Something').click()
        self.assertIn(
            'Required input is missing.', browser.contents)

需要检查的两件事使我花了一些时间进行调试:

  1. 您必须使用transaction.commit()来反映ZODB上的对象创建
  2. 您必须先添加授权标头才能尝试打开页面

其他一切正常。

我会避免在测试代码中使用事务提交。 测试框架经过专门设计,可以在每次测试结束时回滚事务。 您的setUp替代与此相​​反。

要在单元测试中检查状态消息,您应该可以执行以下操作:

from Products.statusmessages.interfaces import IStatusMessage
IStatusMessage(request).show()

这是适应请求的适配器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM