summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGavin Panella <gavin@gromper.net>2011-06-12 16:30:48 +0100
committerGavin Panella <gavin@gromper.net>2011-06-12 16:30:48 +0100
commitf3b68d26ebd3e6b2c3380b17351faa231fa4af1d (patch)
treece5dd6629801649ba36b17abe4b2aacf96d39e49
parente5d2c7544711a83d9956d7f73140105027814de0 (diff)
downloadfixtures-f3b68d26ebd3e6b2c3380b17351faa231fa4af1d.tar.gz
Gather details from fixtures that fail to setUp().
-rw-r--r--lib/fixtures/fixture.py19
-rw-r--r--lib/fixtures/tests/test_fixture.py24
2 files changed, 40 insertions, 3 deletions
diff --git a/lib/fixtures/fixture.py b/lib/fixtures/fixture.py
index 933a9b2..3d41b11 100644
--- a/lib/fixtures/fixture.py
+++ b/lib/fixtures/fixture.py
@@ -28,6 +28,11 @@ except ImportError:
class MultipleExceptions(Exception):
"""Report multiple exc_info tuples in self.args."""
+try:
+ from testtools.testcase import gather_details
+except ImportError:
+ gather_details = None
+
class Fixture(object):
"""A Fixture representing some state or resource.
@@ -173,9 +178,17 @@ class Fixture(object):
:return: The fixture, after setting it up and scheduling a cleanup for
it.
"""
- fixture.setUp()
- self.addCleanup(fixture.cleanUp)
- return fixture
+ try:
+ fixture.setUp()
+ except:
+ if gather_details is not None:
+ gather_details(fixture, self)
+ raise
+ else:
+ self.addCleanup(fixture.cleanUp)
+ if gather_details is not None:
+ self.addCleanup(gather_details, fixture, self)
+ return fixture
class FunctionFixture(Fixture):
diff --git a/lib/fixtures/tests/test_fixture.py b/lib/fixtures/tests/test_fixture.py
index ef67e4f..c3d5d15 100644
--- a/lib/fixtures/tests/test_fixture.py
+++ b/lib/fixtures/tests/test_fixture.py
@@ -110,6 +110,30 @@ class TestFixture(testtools.TestCase):
['setUp-outer', 'setUp-inner', 'cleanUp-inner', 'cleanUp-outer'],
parent.calls)
+ def test_useFixture_details_captured_from_setUp(self):
+ # Details added during fixture set-up are gathered even if setUp()
+ # fails with an exception.
+ from testtools.content import text_content
+ class SomethingBroke(Exception): pass
+ class BrokenFixture(fixtures.Fixture):
+ def setUp(self):
+ super(BrokenFixture, self).setUp()
+ self.addDetail('content', text_content("foobar"))
+ raise SomethingBroke()
+ broken_fixture = BrokenFixture()
+ class SimpleFixture(fixtures.Fixture):
+ def setUp(self):
+ super(SimpleFixture, self).setUp()
+ self.useFixture(broken_fixture)
+ simple_fixture = SimpleFixture()
+ self.assertRaises(SomethingBroke, simple_fixture.setUp)
+ self.assertEqual(
+ {"content": text_content("foobar")},
+ broken_fixture.getDetails())
+ self.assertEqual(
+ {"content": text_content("foobar")},
+ simple_fixture.getDetails())
+
def test_getDetails(self):
fixture = fixtures.Fixture()
with fixture: