如何测试进行重定向的帮助程序Grok视图

时间:2014-04-22 17:14:26

标签: testing plone grok

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

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

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

我的代码如下:

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对象结束,因为视图没有返回任何内容。我不知道在哪里寻找消息......请求?响应?任何提示?

2 个答案:

答案 0 :(得分:2)

我最终使用基于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. 您必须在尝试打开页面之前添加授权标题
  3. 其他一切正常。

答案 1 :(得分:2)

我会避免在测试代码中使用事务提交。测试框架专门用于在每次测试结束时回滚事务。你的setUp覆盖与此相反。

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

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

这是一个适应请求的适配器。