Message405982
In Python 3.8 and later creating a mock with a spec specifying an object containing a property that happens to raise an exception when accessed will fail, because _mock_add_spec calls getattr() on every attribute of the spec. This did not happen in Python 3.6/3.7.
This is likely a fairly unusual scenario (and in the particular case where I encountered this I could just use a class instead of an instance for the spec), but it was surprising.
For example:
# cat test.py
from unittest import mock
class Foo:
@property
def bar(self) -> str:
raise Exception('xxx')
m = mock.MagicMock(spec=Foo())
# python3.11 test.py
Traceback (most recent call last):
File "/root/test.py", line 8, in <module>
m = mock.MagicMock(spec=Foo())
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/unittest/mock.py", line 2069, in __init__
_safe_super(MagicMixin, self).__init__(*args, **kw)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/unittest/mock.py", line 1087, in __init__
_safe_super(CallableMixin, self).__init__(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/unittest/mock.py", line 442, in __init__
self._mock_add_spec(spec, spec_set, _spec_as_instance, _eat_self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/unittest/mock.py", line 497, in _mock_add_spec
if iscoroutinefunction(getattr(spec, attr, None)):
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/test.py", line 6, in bar
raise Exception('xxx')
^^^^^^^^^^^^^^^^^^^^^^
Exception: xxx |
|
Date |
User |
Action |
Args |
2021-11-08 19:47:53 | kjamieson | set | recipients:
+ kjamieson |
2021-11-08 19:47:53 | kjamieson | set | messageid: <1636400873.51.0.88200985051.issue45756@roundup.psfhosted.org> |
2021-11-08 19:47:53 | kjamieson | link | issue45756 messages |
2021-11-08 19:47:53 | kjamieson | create | |
|