1

いくつかの条件をチェックし、いくつかの変更を加え、メッセージを設定し、元のオブジェクトにリダイレクトするヘルパー 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 オブジェクトで終了しました。メッセージを探す場所がわかりません... リクエストしますか? 応答?ヒントはありますか?

4

2 に答える 2

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)

デバッグに時間を費やす必要があることを確認する必要がある2つのこと:

  1. transaction.commit()オブジェクトの作成を ZODB に反映するために使用する必要があります
  2. ページを開こうとする前に、認証ヘッダーを追加する必要があります

他のすべてが機能しています。

于 2014-04-22T19:00:17.833 に答える