5

pasterを介していくつかのBrowserViewを追加しましたが、繰り返し可能で一貫性のあるテストが好きなので、plone.app.testingからそれらを実行しようとしています。ブラウザから手動でビューを呼び出すことは問題なく機能します。

ビューを手動でインポートして初期化することと、制限されたトラバースからクラスを呼び出すことの両方を試しました。どちらの場合も、オブジェクトは正常に初期化されますが、インスタンスを関数として呼び出すか、__ call __()メソッドを使用してレンダリングをトリガーしようとすると、次のエラーが発生します。

*** KeyError: 'global_cache_settings

plone.app.testingのREADME.rstの例を見てみましたが、問題については言及されていないようです。すばやくグーグルしても結果は得られませんでした。これはサイトのカスタマイズの1つである可能性がありますが、ソースをgrepすると、Products.CMFPloneに「global_cache_settings」と記載されていることがわかりました。

eggs/Products.CMFPlone-4.1.4-py2.6.egg/Products/CMFPlone/skins/plone_templates/main_template.pt
28:  <metal:cache use-macro="context/global_cache_settings/macros/cacheheaders">
29:    Get the global cache headers located in global_cache_settings.

eggs/plone.app.layout-2.1.13-py2.6.egg/plone/app/layout/presentation/presentation.pt
11:    <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
12:        Get the global cache headers located in global_cache_settings.

eggs/plonetheme.sunburst-1.1.6-py2.6.egg/plonetheme/sunburst/skins/sunburst_templates/main_template.pt
20:    <metal:cache use-macro="context/global_cache_settings/macros/cacheheaders">
21:    Get the global cache headers located in global_cache_settings.

関連するクラス宣言は次のとおりです。

from zope.interface import implements, Interface

from Products.Five import BrowserView
from Products.CMFCore.utils import getToolByName
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from Products.MyProduct import MyProductMessageFactory as _

class IPromoBoardHome(Interface):
    """
    PromoBoardHome view interface
    """
    def __init__(self, context, request):
        pass
    def __call__(self):
        pass
    def test():
        """ test method"""


class PromoBoardHome(BrowserView):
    """
    PromoBoardHome browser view
    """
    implements(IPromoBoardHome)

    def __init__(self, context, request):
        self.context = context
        self.request = request
    def __call__(self):
        return ViewPageTemplateFile('pt/promoboardhome.pt')(self)
    @property
    def portal_catalog(self):
        return getToolByName(self.context, 'portal_catalog')

    @property
    def portal(self):
        return getToolByName(self.context, 'portal_url').getPortalObject()


    def test(self):
        """
        test method
        """
        dummy = _(u'a dummy string')

        return {'dummy': dummy}

レンプレート:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
    lang="en"
    metal:use-macro="here/main_template/macros/master"
    i18n:domain="Products.MyProduct">
<body>
    <div metal:fill-slot="main">
        <tal:main-macro metal:define-macro="main"
                        tal:define="testview view/test">

            <span tal:content="testview/dummy">test</span>

        </tal:main-macro>
    </div>
</body>
</html>

configure.zcml宣言:

<browser:page
    for="*"
    name="promoboardhome"
    class=".promoboardhome.PromoBoardHome"
    allowed_interface=".promoboardhome.IPromoBoardHome"
    permission="zope2.View"
/>

テストファイル:

import unittest2 as unittest
from . import PROD_INTEGRATION_TESTING

from plone.app.testing import setRoles, TEST_USER_ID

from Products.CMFCore.utils import getToolByName
from Products.MyProduct.browser.promoboardhome import PromoBoardHome

class TestPromoBoardHome(unittest.TestCase):
    layer = PROD_INTEGRATION_TESTING
    def setUp(self):
        self.portal = self.layer['portal']
    def test_call(self):
        pbh = self.portal.restrictedTraverse('@@promoboardhome')
        try:
            pbh()
        except KeyError:
            print "that didn't work!"
            import pdb; pdb.set_trace()

私はここで何か間違ったことをしていますか?

4

2 に答える 2

5

ブラウザビューは、名前付きのマルチアダプタに他なりません。それらをテストするには、適切なコンテキストでそれらを呼び出し、ビューに対して宣言されたインターフェイスを提供するようにリクエストを手動で設定します。あなたの場合、おそらく次のようなものです:

from zope.interface import alsoProvides
from Products.MyProduct.browser.promoboardhome import IPromoBoardHome

class TestPromoBoardHome(unittest.TestCase):

    layer = PROD_INTEGRATION_TESTING

    def setUp(self):
        self.portal = self.layer['portal']
        self.request = self.layer['request']
        alsoProvides(self.request, IPromoBoardHome)

collective.nitfのようなパッケージでたくさんのブラウザビューテストがあります。

ハッピーテスト!

于 2012-11-15T12:40:53.417 に答える
2

代わりに、testbrowserを使用してビューをテストすることをお勧めします。

from plone.testing import z2
browser = z2.Browser(self.layer['app'])
browser.open(self.layer['portal'].absolute_url() + '/@@promoboardhome')

または類似。

于 2012-11-11T07:13:33.263 に答える