2012-11-11 6 views
5

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?

risposta

5

Le visualizzazioni del browser non sono altro che multi-adattatori denominati; per testarli li hai chiamati nel giusto contesto e per impostare manualmente la richiesta di fornire l'interfaccia dichiarata per la vista; in voi caso è probabilmente qualcosa di simile:

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) 

Ho un sacco di browser che vede test su pacchetti come collective.nitf.

Test felici!

2

probabilmente si desidera verificare le opinioni con testbrowser invece:

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

o simili.

+0

Potrei farlo, ma non penso che sarebbero test di integrazione e più test di accettazione. Ma questo risolve il problema come soluzione alternativa. Grazie. –

+1

@AlexVolkov: È utilizzabile per entrambi, ed è in che modo tipicamente viene effettuato il test di integrazione in Plone. –

Problemi correlati