Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to access views defined with a specific [plone.]browserlayer in test cases

Tags:

testing

plone

I'm new to testing and I'm trying to create a test for my Plone product for the first time. I'm on Plone 3.3.

The basic test suite works, I can execute it without errors. I followed this documentation : http://plone.org/documentation/kb/testing ...except that I'm writing my tests in Python classes instead of doctests.

My problem is that I cannot seem to access the views defined in my app (I get ComponentLookupError).

The problem seems to be with the "browserlayer" defined by my applications. When I remove the layer="..." attribute from my configure.zcml, the test can access the views without problem. However, if I add it back, it doesn't work. I guess that's because de browserlayer interface doesn't get applied to the request.

The only reference to this problem I found is in the tests for googlesitemap : http://dev.plone.org/collective/browser/googlesitemap/googlesitemap.common/trunk/googlesitemap/common/tests?rev=

The author seems to have made a custom ZCML file for the test, in which the layer="..." attribute has been removed. (which would work but it seems very bad having to maintain a separate zcml file for the tests)

In my test, I have included the following (taken from the googlesitemap tests), which passes :

from jambette.site.interfaces import IJambetteLayer # this is my browserlayer
from plone.browserlayer.utils import registered_layers
self.assertTrue(IJambetteLayer in registered_layers())

So I think my skin and browserlayer are registered correctly.

Is there anything I need to do so that the browserlayer will be applied to the request?

like image 706
jphoude Avatar asked Apr 11 '11 22:04

jphoude


1 Answers

Browser layer interfaces are simply 'painted' onto the request with directlyProvides. Simply do so in your test setup before you look up the view:

from zope import interface
from jambette.site.interfaces import IJambetteLayer

...

    directlyProvides(request, IJambetteLayer)
like image 176
Martijn Pieters Avatar answered Sep 24 '22 15:09

Martijn Pieters