我有一个内容类型需要在调用帮助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对象结束,因为视图没有返回任何内容。我不知道在哪里寻找消息......请求?响应?任何提示?
答案 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)
你需要检查的两件事让我花了一些时间调试:
transaction.commit()
来反映ZODB上的对象创建其他一切正常。
答案 1 :(得分:2)
我会避免在测试代码中使用事务提交。测试框架专门用于在每次测试结束时回滚事务。你的setUp覆盖与此相反。
要检查单元测试中的状态消息,您应该能够执行以下操作:
from Products.statusmessages.interfaces import IStatusMessage
IStatusMessage(request).show()
这是一个适应请求的适配器。