[Zope3-Users] testing: provideInterface and vocabulary named 'Interfaces'
Christian Lück
christian.lueck at ruhr-uni-bochum.de
Fri Feb 20 03:51:43 EST 2009
Hi,
I'm stuck with testing (= developing) my components.
I have an interface with a zope.schema.Choice field where the vocabulary
is zope3's vocabulary named 'Interfaces' from the zope.app.component
package.
The problem with testing occures when I try to assign a value to the
field, inspite of providing the interface in the test and having
registered the InterfaceVocabulary from zope.app.component.vocabulary
for the test. The traceback says that an adapter is missing - but which
one? A part of the registry seems to be missing.
(I don't want to bring up the whole system because of performance--I
develop components while writing tests in emacs doctest-mode and driving
the test again and again ...)
Here is the interface:
import zope.interface
import zope.schema
from zope.app.container.interfaces import IContained, IContainer
from zope.app.container.constraints import containers, contains
from zope.i18nmessageid import MessageFactory
_ = ReferatoryMessageFactory = MessageFactory('quotationtool')
...
class ICategorizableItemDescription(IContained):
"""A description of a ZOPE3 interface which users can
understand. It is used to create a term for the vocabulary of
categorizable item classes. The label will be used as the title
of the term instead of the python module name of the
interface."""
containers(ICategorizableItemDescriptions)
interface = zope.schema.Choice(
title = _('icategorizableitemdescription-interface-title',
u"Interface"),
description = _('icategorizableitemdescription-interface-desc',
u"Choose an ZOPE-Interface from the list."),
required = True,
vocabulary = 'Interfaces',
)
label = zope.schema.TextLine(
title = _('icategorizableitemdescription-label-title',
u"Label"),
description = _('icategorrizableitemdescription-label-description',
u"Descriptive term for the interface which users
can understand."),
required = True,
)
Here is what is brought up for the test:
...
from quotationtool.categorization.weighteditemscontainer import
updateWeightedItemsContainerOrder
from quotationtool.categorization.categorizableitemdescription import
categorizableItemDescriptionVocabulary
from quotationtool.categorization.mode import modeVocabulary
def setUp(test):
zope.component.testing.setUp(test)
zope.component.eventtesting.setUp(test)
zope.component.provideHandler(updateWeightedItemsContainerOrder)
vocabulary.setVocabularyRegistry(vocabulary.VocabularyRegistry())
vr = vocabulary.getVocabularyRegistry()
vr.register('quotationtool.categorization.categorizableitemdescription',
categorizableItemDescriptionVocabulary)
vr.register('quotationtool.categorization.mode',
modeVocabulary)
vr.register('Interfaces',
InterfacesVocabulary)
...
Here are the first lines of the test and the traceback:
>>> from quotationtool.categorization import interfaces
>>> import zope.interface
>>> import zope.component
>>> from quotationtool.categorization.categorizableitemdescription\
... import CategorizableItemDescription,
CategorizableItemDescriptions
>>> publication_desc = CategorizableItemDescription()
>>> class IPublication(zope.interface.Interface):
... pass
>>> zope.component.interface.provideInterface('.IPublication',
IPublication)
>>> iface = zope.component.interface.getInterface(None, '.IPublication')
>>> iface == IPublication
True
>>> publication_desc.interface = IPublication
Traceback (most recent call last):
File
"/home/clueck/.buildout-eggs/zope.testing-3.7.1-py2.4.egg/zope/testing/doctest.py",
line
1356, in __run
compileflags, 1) in test.globs
File "<doctest README.txt[10]>", line 1, in ?
publication_desc.interface = IPublication
File
"/home/clueck/.buildout-eggs/zope.schema-3.5.0a2-py2.4.egg/zope/schema/fieldproperty.py",
line 51, in __set__
field = self.__field.bind(inst)
File
"/home/clueck/.buildout-eggs/zope.schema-3.5.0a2-py2.4.egg/zope/schema/_field.py",
line 2
86, in bind
clone.vocabulary = vr.get(object, self.vocabularyName)
File
"/home/clueck/.buildout-eggs/zope.schema-3.5.0a2-py2.4.egg/zope/schema/vocabulary.py",
li
ne 166, in get
return vtype(object)
File
"/home/clueck/.buildout-eggs/zope.app.component-3.5.0-py2.4.egg/zope/app/component/vocabu
lary.py", line 197, in __init__
utils = zope.component.getUtilitiesFor(self.interface, context)
File
"/home/clueck/.buildout-eggs/zope.component-3.5.1-py2.4.egg/zope/component/_api.py",
line
212, in getUtilitiesFor
return getSiteManager(context).getUtilitiesFor(interface)
File
"/home/clueck/.buildout-eggs/zope.component-3.5.1-py2.4.egg/zope/component/_api.py",
line
51, in getSiteManager
raise ComponentLookupError(*error.args)
ComponentLookupError: ('Could not adapt',
<quotationtool.categorization.categorizableitemdescrip
tion.CategorizableItemDescription object at 0xb71b556c>, <InterfaceClass
zope.component.interfaces.I
ComponentLookup>)
An adapter seems to be missing. That adapter--I guess--adapts to *
Which component should I register?
Regards,
Christian
More information about the Zope3-users
mailing list