Jim Fulton wrote:
Am I right in assuming that there aren't any good narrative docs for
test layers?
This is obviously in the eye of the beholder. I'm sure the people
who created narratives tried to do a good job. Perhaps you can do better.
I may be missing some then... which narratives are you thinking of?
And yes, I'm hoping to do better unless I've just missed some existing
docs...
I've attached a test file which opened my eyes... how do I go about
weaving this into a doctest?
Now, related to this, say I have content objects X and Y, which are
expensive to set up. I have LayerX which sets up a sample content
object X, and LayerY which does the same for content object Y. This is
fine for tests which need one or other content type, but how do I
write tests which need both?
You create a layer that extends both.
How so?
Here's a sample of why I'm struggling:
class ZODB:
@classmethod
def setUp(cls):
... open zodb connection
... begin transaction
@classmethod
def tearDown(cls):
... abort transaction
... close connection
class LayerX(ZODB):
@classmethod
def setUp(cls):
cls.savepoint = transaction.savepoint()
... create X instance
@classmethod
def tearDown(cls):
cls.savepoint.rollback()
class LayerY(ZODB):
def setUp(cls):
cls.savepoint = transaction.savepoint()
... create Y instance
@classmethod
def tearDown(cls):
cls.savepoint.rollback()
class MyLayer(LayerX,LayerY): pass
class MyTests(TestCase):
layer = '.MyLayer'
def setUp(self):
self.savepoint = transaction.savepoint()
def tearDown(self):
self.savepoint.rollback()
def test_1(self):
pass
Basically, will the above work or will the savepoints become a horrible
jumbled mess and I end up with several ZODB connections as well?
cheers,
Chris
PS: can I use '.MyLayer' as a layer, or do I always need to put the full
dotted path in?
--
Simplistix - Content Management, Zope & Python Consulting
- http://www.simplistix.co.uk
from unittest import TestSuite, makeSuite, TestCase
class MyLayer:
@classmethod
def setUp(self):
# do something here
print 'L1 setup'
print self
@classmethod
def tearDown(self):
# undo it here
print 'L1 teardown'
class MyExtendedLayer(MyLayer):
@classmethod
def setUp(self):
# do additional stuff here
# don't call super
print 'L2 setup'
@classmethod
def tearDown(self):
# undo it only the additional stuff here
# don't call super
print 'L2 teardown'
raise RuntimeError('fubar MyExtendedLayer.tearDown')
class T1(TestCase):
layer = 'Products.MyProduct.tests.test_layers.MyLayer'
def setUp(self):
print "T1 setup"
def tearDown(self):
print "T1 teardown"
def test_1(self):
print 'T1.1'
def test_2(self):
print 'T1.2'
def test_3(self):
print 'T1.3'
raise RuntimeError('fubar T1.test_3')
class T2(TestCase):
layer = 'Products.MyProduct.tests.test_layers.MyExtendedLayer'
def setUp(self):
print "T2 setup"
def tearDown(self):
print "T2 teardown"
raise RuntimeError('fubar')
def test_1(self):
print 'T2.1'
def test_2(self):
print 'T2.2'
def test_3(self):
print 'T2.3'
raise RuntimeError('fubar T2.test_3')
class T3(TestCase):
def setUp(self):
print "T3 setup"
raise RuntimeError('fubar')
def tearDown(self):
print "T3 teardown"
def test_1(self):
print 'T3.1'
def test_suite():
suite = TestSuite()
suite.addTest(makeSuite(T1))
suite.addTest(makeSuite(T2))
suite.addTest(makeSuite(T3))
return suite
_______________________________________________
Zope3-dev mailing list
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com