diff options
author | Gavin Panella <gavin@gromper.net> | 2011-06-12 16:30:48 +0100 |
---|---|---|
committer | Gavin Panella <gavin@gromper.net> | 2011-06-12 16:30:48 +0100 |
commit | f3b68d26ebd3e6b2c3380b17351faa231fa4af1d (patch) | |
tree | ce5dd6629801649ba36b17abe4b2aacf96d39e49 | |
parent | e5d2c7544711a83d9956d7f73140105027814de0 (diff) | |
download | fixtures-f3b68d26ebd3e6b2c3380b17351faa231fa4af1d.tar.gz |
Gather details from fixtures that fail to setUp().
-rw-r--r-- | lib/fixtures/fixture.py | 19 | ||||
-rw-r--r-- | lib/fixtures/tests/test_fixture.py | 24 |
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: |