|
10 | 10 | from codecs import BOM_UTF8 |
11 | 11 | from itertools import product |
12 | 12 | from textwrap import dedent |
| 13 | +from types import ModuleType |
13 | 14 |
|
14 | 15 | from test.support import (captured_stderr, check_impl_detail, |
15 | 16 | cpython_only, gc_collect, |
@@ -2047,6 +2048,38 @@ def blech(self): |
2047 | 2048 | self.assertEqual("bluch", exc.name) |
2048 | 2049 | self.assertEqual(obj, exc.obj) |
2049 | 2050 |
|
| 2051 | + def _test_generated_message(self, obj, name): |
| 2052 | + with self.assertRaises(AttributeError) as cm: |
| 2053 | + getattr(obj, name) |
| 2054 | + self.assertEqual(str(cm.exception), |
| 2055 | + f"{obj!r} has no attribute {name!r}") |
| 2056 | + |
| 2057 | + def test_getattr_error_message(self): |
| 2058 | + class RaiseWithName: |
| 2059 | + def __getattr__(self, name): |
| 2060 | + raise AttributeError(name) |
| 2061 | + |
| 2062 | + class BareRaise: |
| 2063 | + def __getattr__(self, name): |
| 2064 | + raise AttributeError |
| 2065 | + |
| 2066 | + self._test_generated_message(RaiseWithName(), "missing1") |
| 2067 | + self._test_generated_message(BareRaise(), "missing2") |
| 2068 | + |
| 2069 | + def test_module_getattr_attribute_error_message(self): |
| 2070 | + mod1 = ModuleType("raisewithname") |
| 2071 | + def raise_with_name(name): |
| 2072 | + raise AttributeError(name) |
| 2073 | + mod1.__getattr__ = raise_with_name |
| 2074 | + |
| 2075 | + mod2 = ModuleType("bareraise") |
| 2076 | + def bare_raise(name): |
| 2077 | + raise AttributeError |
| 2078 | + mod2.__getattr__ = bare_raise |
| 2079 | + |
| 2080 | + self._test_generated_message(mod1, "missing3") |
| 2081 | + self._test_generated_message(mod2, "missing4") |
| 2082 | + |
2050 | 2083 | # Note: name suggestion tests live in `test_traceback`. |
2051 | 2084 |
|
2052 | 2085 |
|
|
0 commit comments