[Grok-dev] getUtility(ICatalog) fails with ComponentLookupError

Christian Klinger cklinger at novareto.de
Fri Nov 11 08:14:36 UTC 2011


Hi,

what kind of testsetup do you use in your unittest?
Do you use the default setup?

Christian

> El 10/11/11 09:24, Sylvain Viollon escribió:
>> Op 9 nov 2011, om 23:16 heeftÀlex Magaz Graça het volgende geschreven:
>>
>>> Hello,
>>>
>>     Hello,
>>
>>> I have an application with code like this:
>>>
>>> from zope.component import getUtility
>>> from zope.catalog.interfaces import ICatalog
>>> ...
>>>
>>> class TicketCatalog(grok.Container):
>>>      ...
>>>      def getActiveTickets(self):
>>>          catalog = getUtility(ICatalog)
>>>          ...
>>>
>>> after following the code at the end of the example here:
>>>
>>> http://grok.zope.org/doc/current/reference/components.html#grok.index.Value
>>>
>>
>>      I you call a method of your content that rely on your Grok site directly from a unittest, you need to setup your Grok as a local site for the Zope component architecture. This is automatically done by publisher when your Grok site is traversed in a request.
>>
>>      In your unittest you need to do before:
>>
>>      from zope.component.hooks import setSite, getSite
>>
>>      setSite(self.yourgroksite)
>>
>>      If you after call getSite(), your Grok must be returned. The setup of your testcase is a good place to do that I think.
>>
>>      Regards,
>>
>>      Sylvain
>>
>>
>
> Thanks for your quick response!
>
> I've been trying but still no luck :/
>
> First I've added a setUp() method with a call to setSite() like this
> (where Helpdesk is a grok.Application):
>
> class TicketCatalogTest(unittest.TestCase):
> def setUp(self):
> helpdesk = Helpdesk()
> self._catalog = helpdesk.ticketCatalog
> setSite(helpdesk)
>
> but I get this:
>
> Error in test testGetActiveTickets
> (helpdesk.tests.test_helpdesk.TicketCatalogTest)
> Traceback (most recent call last):
> File "/usr/lib/python2.7/unittest/case.py", line 312, in run
> self.setUp()
> File
> "/home/alex/uni/projecte/repo/list-active-tickets/HelpDesk/src/helpdesk/tests/test_helpdesk.py",
> line 23, in setUp
> setSite(helpdesk)
> File
> "/home/alex/.buildout/eggs/zope.component-3.10.0-py2.7.egg/zope/component/hooks.py",
> line 67, in setSite
> sm = site.getSiteManager()
> File
> "/home/alex/.buildout/eggs/zope.site-3.9.2-py2.7.egg/zope/site/site.py",
> line 76, in getSiteManager
> raise ComponentLookupError('no site manager defined')
> ComponentLookupError: no site manager defined
>
> Then, greping around in ~/.buildout I found some tests which set a site
> manager, so I end up with the following code:
>
> def setUp(self):
> helpdesk = Helpdesk()
> self._catalog = helpdesk.ticketCatalog
>
> setHooks()
> provideAdapter(
> SiteManagerAdapter, (Interface,), IComponentLookup)
> site = rootFolder()
> site.setSiteManager(LocalSiteManager(site))
> setSite(site)
>
> But then again the look up error:
>
> Error in test testGetActiveTickets
> (helpdesk.tests.test_helpdesk.TicketCatalogTest)
> Traceback (most recent call last):
> File "/usr/lib/python2.7/unittest/case.py", line 321, in run
> testMethod()
> File
> "/home/alex/uni/projecte/repo/list-active-tickets/HelpDesk/src/helpdesk/tests/test_helpdesk.py",
> line 45, in testGetActiveTickets
> activeTickets = self._catalog.getActiveTickets()
> File
> "/home/alex/uni/projecte/repo/list-active-tickets/HelpDesk/src/helpdesk/app.py",
> line 31, in getActiveTickets
> catalog = getUtility(ICatalog)
> File
> "/home/alex/.buildout/eggs/zope.component-3.10.0-py2.7.egg/zope/component/_api.py",
> line 169, in getUtility
> raise ComponentLookupError(interface, name)
> ComponentLookupError: (<InterfaceClass
> zope.catalog.interfaces.ICatalog>, '')
>
> I've tried several variations of this codes, but there's always
> something that fails. So I'm back to the beginning.
>
> Any idea of what is missing? A link to documentation about this or code
> examples would be very useful. I didn't find anything.
>
> Thanks,
> Àlex
>
>
> _______________________________________________
> Grok-dev mailing list
> Grok-dev at zope.org
> https://mail.zope.org/mailman/listinfo/grok-dev




More information about the Grok-dev mailing list