Repository navigation
mock raises exception when using a spec with an attribute that raises exception on access #89917
Copy link
Copy link
Closed as not planned
Closed as not planned
Copy link
Labels
3.10 (EOL)end of lifeend of life3.11only security fixesonly security fixes3.8 (EOL)end of lifeend of life3.9 (EOL)end of lifeend of lifetype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Activity
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
- added3.8 (EOL)end of lifeend of life3.9 (EOL)end of lifeend of life3.10 (EOL)end of lifeend of life3.11only security fixesonly security fixestype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Nov 8, 2021 I think I encountered this when trying to mock
requests.Response: psf/requests#5944This seems to be similar to https://bugs.python.org/issue41768 .
Closing as duplicate of #85934
Metadata
Metadata
Assignees
Labels
3.10 (EOL)end of lifeend of life3.11only security fixesonly security fixes3.8 (EOL)end of lifeend of life3.9 (EOL)end of lifeend of lifetype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Projects
- StatusShow more project fieldsDone
@propertydescrs while creating mock autospecs #29901Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields: