Thanks Andreas and Dieter, The explanation was quite simple, I set an attribute on an object that was a method like this:: class TestBase(ZopeTestCase.ZopeTestCase): def dummy_redirect(self, *a, **kw): self.has_redirected = a[0] if kw: print "*** Redirecting to %r + (%s)" % (a[0], kw) else: print "*** Redirecting to %r" % a[0] def afterSetUp(self): self._setupDBConnection() dispatcher = self.folder.manage_addProduct['MExpenses'] dispatcher.manage_addHomepage('mexpenses') self.mexpenses = self.folder['mexpenses'] self.mexpenses.http_redirect = self.dummy_redirect # NOTICE!! request = self.app.REQUEST sdm = self.app.session_data_manager request.set('SESSION', sdm.getSessionData()) self.has_redirected = False The reason for the dummy redirector is boring. The reason for the transaction.get().commit() is to not cancel everything when a ConflicrError happens during a very long-lasting file upload. Again, thanks. PS. Andreas, I did use your set_trace() tip on the ZODB code. Isn't Python great! On 08/01/2008, Dieter Maurer <dieter@handshake.de> wrote:
Peter Bengtsson wrote at 2008-1-7 18:29 +0000:
My code works fine in normal running zope but not when run as a testcase (I'm not using bin/zopectl test if that matters) I get the following error. I feel guilty since I've got this line in my code: transaction.get().commit() (Expense.py#4458)
I remember having come across this error before but can't remember what the solution was. ... File "/home/peterbe/zope/zope285/lib/python/ZODB/serialize.py", line 339, in _dump self._p.dump(state) File "copy_reg.py", line 69, in _reduce_ex raise TypeError, "can't pickle %s objects" % base.__name__ TypeError: can't pickle instancemethod objects
----------------------------------------------------------------------
Apparently, you have an "instancemethod" in your test setup where you do not have one in the normal Zope.
An alternative explanation could be that in your normal Zope additional pickle registrations are performed. If you would use, e.g., my "CompiledExecutable" product, then the import of this product would register "code" and "instancemethod" instances as picklable. A test setup may not import "CompiledExecutables" and its pickle registrations would be missing.
A side note: Usually, it is a very bad idea to perform a full "commit" in a test. Such "commit"s are incompatible with techniques that share (for efficiency reasons) part of the test setup among several tests. "ZopeTestCase", e.g., makes use of such techniques.
-- Dieter
-- Peter Bengtsson, work www.fry-it.com home www.peterbe.com hobby www.issuetrackerproduct.com