Как протестировать вспомогательное представление 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, так как представление ничего не возвращает. Я не знаю, где искать сообщения... запрос? отклик? любой намек?


person hvelarde    schedule 22.04.2014    source источник


Ответы (2)


Я бы не стал использовать коммиты транзакций в тестовом коде. Платформа тестирования специально разработана для отката транзакций в конце каждого теста. Ваше переопределение setUp противоречит этому.

Чтобы проверить сообщения о состоянии в модульном тесте, вы должны сделать что-то вроде:

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

Это адаптер, который адаптирует запрос.

person adamfc    schedule 23.04.2014
comment
спасибо, ваше решение сработало как шарм и намного проще, чем мое. - person hvelarde; 23.04.2014

Я закончил тест со слоем на основе 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. вы должны добавить заголовок авторизации, прежде чем пытаться открыть страницу

все остальное работает.

person hvelarde    schedule 22.04.2014