Hi folks,

cc'ing Stefan 'cause it's his code :-)
but I thought it would be of interest to this list.

I've been using CMFTestCase to test my CMF tools.
But lately I've discovered that, if I follow the practice demonstrated
in CMFTestCase/testSkeleton.py, and create the CMF site once at
module level, then I have fatally polluted the environment for any
modules that may run later, e.g. other test modules.

For example, if I install CMF (1.4.8)  and one of my own Products, which
product contains this line:

# Create the CMF site once.
CMFTestCase.setupCMFSite()

.... and then I run "./bin/zopectl test -v", then
I get about 25 new errors from core CMF tests like so:

======================================================================
ERROR: test_Image_RenameKeepsWorkflowState
(Products.CMFDefault.tests.test_Image
..TestImageCopyPaste)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/zope/PaulInst2/Products/CMFDefault/tests/test_Image.py", line 65,
in setUp
    self.root.manage_addProduct['CMFDefault'].manage_addCMFSite('cmf')
  File "/zope/PaulInst2/Products/CMFDefault/Portal.py", line 339, in
manage_addCMFSite
    p = gen.create(self, id, create_userfolder)
  File "/zope/PaulInst2/Products/CMFDefault/Portal.py", line 309, in create
    parent._setObject(id, portal)
  File "/zope/ZopeSoftwareHome/lib/python/OFS/ObjectManager.py", line 248,
in _setObject
    v=self._checkId(id)
  File "/zope/ZopeSoftwareHome/lib/python/OFS/ObjectManager.py", line 81,
in checkValidId
    raise BadRequest, (
BadRequest: The id "cmf" is invalid - it is already in use.

======================================================================


This goes away if I delete my Product, so it's pretty clearly caused by my
test module leaving the CMF site around.

So, how do I clean up something that I created at module level?
And if that's not the right way to set up the site - what is?

I can't create the site in afterSetUp() because apparently getPortal()
needs to be able to find the portal already before that's called.

At one time, I naively had it set up in getPortal() but that seems
to have worked only in one product and only by bizarre coincidence as it
failed in every other product test I tried it with.
(Random assortment of BadRequest and ReadConflictErrors, I was
never able to sort it all out.) So that seems unlikely to be the Right
Thing (tm).

I'd rather not ditch CMFTestCase altogether, it has some nice
features that I find to be real time (and brain) savers.

-- 
Paul Winkler
http://www.slinkp.com



_______________________________________________
Zope-CMF maillist  -  Zope-CMF@lists.zope.org
http://mail.zope.org/mailman/listinfo/zope-cmf

See http://collector.zope.org/CMF for bug reports and feature requests

Reply via email to