Ho aggiunto un paio di BrowserViews tramite paster, ora sto provando a eseguirli da plone.app.testing, perché mi piacciono i test ripetibili e coerenti. Chiamare manualmente la vista dal browser funziona senza problemi.plone.app.testing non può chiamare BrowserView
Ho provato a importare e inizializzare le viste manualmente, oltre a chiamare la classe da traversata ristretta. In entrambi i casi un oggetto viene inizializzato bene, ma quando provo a far scattare il rendering o chiamando l'istanza come una funzione o utilizzando __call metodo __(), ottengo il seguente errore:
*** KeyError: 'global_cache_settings
ho guardato l'esempio nella README .primo in plone.app.testing non sembra menzionare il problema, quick googling non ha prodotto alcun risultato. Potrebbe essere uno dei personalizzazione del sito, tuttavia quando greping la fonte, ho trovato 'global_cache_settings' di cui al Products.CMFPlone, quindi è probabilmente una cosa plone: dichiarazioni di classe rilevanti
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.
Ecco:
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}
Template:
<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>
dichiarazione configure.zcml:
<browser:page
for="*"
name="promoboardhome"
class=".promoboardhome.PromoBoardHome"
allowed_interface=".promoboardhome.IPromoBoardHome"
permission="zope2.View"
/>
file di test:
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()
sto facendo qualcosa di sbagliato qui?
Potrei farlo, ma non penso che sarebbero test di integrazione e più test di accettazione. Ma questo risolve il problema come soluzione alternativa. Grazie. –
@AlexVolkov: È utilizzabile per entrambi, ed è in che modo tipicamente viene effettuato il test di integrazione in Plone. –