~python-fixtures/debian/sid/python-fixtures/sid

« back to all changes in this revision

Viewing changes to lib/fixtures/tests/test_fixture.py

  • Committer: Robert Collins
  • Date: 2010-09-11 08:54:22 UTC
  • Revision ID: robertc@robertcollins.net-20100911085422-nk6nlhpvrcpm8mtk
Correct the example context manager in README, and provide a protocol for cleanUp to signal exceptions.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
# license you chose for the specific language governing permissions and
14
14
# limitations under that license.
15
15
 
16
 
import unittest
 
16
import sys
 
17
 
17
18
import testtools
18
19
 
19
20
import fixtures
20
21
from fixtures.tests.helpers import LoggingFixture
21
22
 
22
23
 
23
 
class TestFixture(unittest.TestCase):
 
24
class TestFixture(testtools.TestCase):
24
25
 
25
26
    def test_resetCallsSetUpCleanUp(self):
26
27
        calls = []
35
36
        fixture.cleanUp()
36
37
        self.assertEqual(['setUp', 'cleanUp', 'setUp', 'cleanUp'], calls)
37
38
 
38
 
    def test_cleanUpcallscleanups_swallows_exceptions(self):
 
39
    def test_reset_raises_if_cleanup_raises(self):
 
40
        class FixtureWithSetupOnly(fixtures.Fixture):
 
41
            def do_raise(self):
 
42
                raise Exception('foo')
 
43
            def setUp(self):
 
44
                super(FixtureWithSetupOnly, self).setUp()
 
45
                self.addCleanup(self.do_raise)
 
46
        fixture = FixtureWithSetupOnly()
 
47
        fixture.setUp()
 
48
        exc = self.assertRaises(Exception, fixture.reset)
 
49
        self.assertEqual(('foo',), exc.args)
 
50
 
 
51
    def test_cleanUpcallscleanups_returns_exceptions(self):
39
52
        calls = []
40
53
        def raise_exception1():
41
54
            calls.append('1')
50
63
                self.addCleanup(raise_exception1)
51
64
        fixture = FixtureWithException()
52
65
        fixture.setUp()
53
 
        fixture.cleanUp()
 
66
        exceptions = fixture.cleanUp()
54
67
        self.assertEqual(['1', '2'], calls)
 
68
        # There should be two exceptions
 
69
        self.assertEqual(2, len(exceptions))
 
70
        # They should be a sys.exc_info tuple.
 
71
        self.assertEqual(3, len(exceptions[0]))
 
72
        type, value, tb = exceptions[0]
 
73
        self.assertEqual(Exception, type)
 
74
        self.assertIsInstance(value, Exception)
 
75
        self.assertEqual(('woo',), value.args)
 
76
        self.assertIsInstance(tb, sys.exc_info()[2].__class__)
55
77
 
56
78
    def test_exit_propogates_exceptions(self):
57
79
        fixture = fixtures.Fixture()
58
80
        fixture.__enter__()
59
81
        self.assertEqual(False, fixture.__exit__(None, None, None))
60
82
 
61
 
 
62
 
class TestFunctionFixture(unittest.TestCase):
 
83
    def test_exit_runs_all_raises_first_exception(self):
 
84
        calls = []
 
85
        def raise_exception1():
 
86
            calls.append('1')
 
87
            raise Exception('woo')
 
88
        def raise_exception2():
 
89
            calls.append('2')
 
90
            raise Exception('woo')
 
91
        class FixtureWithException(fixtures.Fixture):
 
92
            def setUp(self):
 
93
                super(FixtureWithException, self).setUp()
 
94
                self.addCleanup(raise_exception2)
 
95
                self.addCleanup(raise_exception1)
 
96
        fixture = FixtureWithException()
 
97
        ctx = fixture.__enter__()
 
98
        exc = self.assertRaises(Exception, fixture.__exit__, None, None, None)
 
99
        self.assertEqual(('woo',), exc.args)
 
100
        self.assertEqual(['1', '2'], calls)
 
101
 
 
102
 
 
103
class TestFunctionFixture(testtools.TestCase):
63
104
 
64
105
    def test_setup_only(self):
65
106
        fixture = fixtures.FunctionFixture(lambda: 42)