|
5 | 5 | import ast |
6 | 6 | import io |
7 | 7 | import sys |
| 8 | +import traceback |
8 | 9 |
|
9 | 10 | import testtools |
10 | 11 | from testtools.compat import ( |
| 12 | + reraise, |
11 | 13 | text_repr, |
12 | 14 | unicode_output_stream, |
13 | 15 | ) |
@@ -216,6 +218,43 @@ def test_unicode_examples_multiline(self): |
216 | 218 | self.assertEqual(ast.literal_eval(actual), u) |
217 | 219 |
|
218 | 220 |
|
| 221 | +class TestReraise(testtools.TestCase): |
| 222 | + """Tests for trivial reraise wrapper needed for Python 2/3 changes""" |
| 223 | + |
| 224 | + def test_exc_info(self): |
| 225 | + """After reraise exc_info matches plus some extra traceback""" |
| 226 | + try: |
| 227 | + raise ValueError("Bad value") |
| 228 | + except ValueError: |
| 229 | + _exc_info = sys.exc_info() |
| 230 | + try: |
| 231 | + reraise(*_exc_info) |
| 232 | + except ValueError: |
| 233 | + _new_exc_info = sys.exc_info() |
| 234 | + self.assertIs(_exc_info[0], _new_exc_info[0]) |
| 235 | + self.assertIs(_exc_info[1], _new_exc_info[1]) |
| 236 | + expected_tb = traceback.extract_tb(_exc_info[2]) |
| 237 | + self.assertEqual( |
| 238 | + expected_tb, traceback.extract_tb(_new_exc_info[2])[-len(expected_tb) :] |
| 239 | + ) |
| 240 | + |
| 241 | + def test_custom_exception_no_args(self): |
| 242 | + """Reraising does not require args attribute to contain params""" |
| 243 | + |
| 244 | + class CustomException(Exception): |
| 245 | + """Exception that expects and sets attrs but not args""" |
| 246 | + |
| 247 | + def __init__(self, value): |
| 248 | + Exception.__init__(self) |
| 249 | + self.value = value |
| 250 | + |
| 251 | + try: |
| 252 | + raise CustomException("Some value") |
| 253 | + except CustomException: |
| 254 | + _exc_info = sys.exc_info() |
| 255 | + self.assertRaises(CustomException, reraise, *_exc_info) |
| 256 | + |
| 257 | + |
219 | 258 | def test_suite(): |
220 | 259 | from unittest import TestLoader |
221 | 260 |
|
|
0 commit comments