From: Martin A. <svn...@pl...> - 2010-05-23 15:46:52
|
Author: optilude Date: Sun May 23 15:46:43 2010 New Revision: 36725 Modified: plone.testing/trunk/README.txt plone.testing/trunk/src/plone/testing/layer.py plone.testing/trunk/src/plone/testing/layer.txt Log: Make it easier to access layers in doctests Modified: plone.testing/trunk/README.txt ============================================================================== --- plone.testing/trunk/README.txt (original) +++ plone.testing/trunk/README.txt Sun May 23 15:46:43 2010 @@ -1090,6 +1090,11 @@ you have to set a ``layer`` attribute on the suite after it has been constructed. +Furthermore, to use layer resources in a doctest, we need access to the layer +instance. The easiest way to do this is to pass it as a glob, conventionally +called 'layer'. This makes a global name 'layer' available in the doctest +itself, giving access to the test's layer instance. + To make it easier to do this, ``plone.testing`` comes with a helper function called ``layered()``. Its first argument is a test suite. The second argument is the layer. @@ -1109,14 +1114,14 @@ >>> def test_suite(): ... suite = unittest.TestSuite() ... - ... spaceshipUtilTests = doctest.DocTestSuite('spaceship.utils') + ... spaceshipUtilTests = doctest.DocTestSuite('spaceship.utils', globs={'layer': CONSTITUTION_CLASS_SPACE_SHIP}) ... spaceshipUtilTests.layer = CONSTITUTION_CLASS_SPACE_SHIP ... suite.addTest(spaceshipUtilTests) ... ... return suite -In this example, we've opted to use ``addTest()`` to add a single suite, -instead of using ``addTests()`` to add multiple suites in one go. +(In this example, we've opted to use ``addTest()`` to add a single suite, +instead of using ``addTests()`` to add multiple suites in one go.) Zope testing tools ================== Modified: plone.testing/trunk/src/plone/testing/layer.py ============================================================================== --- plone.testing/trunk/src/plone/testing/layer.py (original) +++ plone.testing/trunk/src/plone/testing/layer.py Sun May 23 15:46:43 2010 @@ -191,9 +191,22 @@ def testTearDown(self): pass -def layered(suite, layer): - """Add the given layer to the given suite and return the suite - """ +def layered(suite, layer, addLayerToDoctestGlobs=True): + """Add the given layer to the given suite and return the suite. + If ``addLayerToDoctestGlobs`` is ``True``, the layer will be added to the + globs (global namespace) of any doctests in the suite, under the name + ``layer``, provided no such glob exists already. + """ suite.layer = layer + + if addLayerToDoctestGlobs: + from doctest import DocTestCase + + for test in suite: + if isinstance(test, DocTestCase): + globs = test._dt_test.globs + if not 'layer' in globs: + globs['layer'] = layer + return suite Modified: plone.testing/trunk/src/plone/testing/layer.txt ============================================================================== --- plone.testing/trunk/src/plone/testing/layer.txt (original) +++ plone.testing/trunk/src/plone/testing/layer.txt Sun May 23 15:46:43 2010 @@ -522,3 +522,11 @@ 1 >>> tests[0].layer is DOCTEST_LAYER True + +In addition, a 'layer' glob is added to each test in the suite. This allows +the test to access layer resources. + + >>> len(list(tests[0])) + 1 + >>> list(tests[0])[0]._dt_test.globs['layer'] is DOCTEST_LAYER + True |