diff options
author | Robert Collins <robert.collins@cognite.com> | 2024-06-11 05:41:12 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-11 05:41:12 (GMT) |
commit | 422c4fc855afd18bcc6415902ea1d85a50cb7ce1 (patch) | |
tree | 78d95472f838196f72aa5d58c97bdfc188a67db1 /Lib/unittest/mock.py | |
parent | 6efe3460693c4f39de198a64cebeeee8b1d4e8b6 (diff) | |
download | cpython-422c4fc855afd18bcc6415902ea1d85a50cb7ce1.zip cpython-422c4fc855afd18bcc6415902ea1d85a50cb7ce1.tar.gz cpython-422c4fc855afd18bcc6415902ea1d85a50cb7ce1.tar.bz2 |
gh-119600: mock: do not access attributes of original when new_callable is set (#119601)
In order to patch flask.g e.g. as in #84982, that
proxies getattr must not be invoked. For that,
mock must not try to read from the original
object. In some cases that is unavoidable, e.g.
when doing autospec. However, patch("flask.g",
new_callable=MagicMock) should be entirely safe.
Diffstat (limited to 'Lib/unittest/mock.py')
-rw-r--r-- | Lib/unittest/mock.py | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 3ef83e2..edabb45 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1508,13 +1508,12 @@ class _patch(object): if isinstance(original, type): # If we're patching out a class and there is a spec inherit = True - if spec is None and _is_async_obj(original): - Klass = AsyncMock - else: - Klass = MagicMock - _kwargs = {} + + # Determine the Klass to use if new_callable is not None: Klass = new_callable + elif spec is None and _is_async_obj(original): + Klass = AsyncMock elif spec is not None or spec_set is not None: this_spec = spec if spec_set is not None: @@ -1527,7 +1526,12 @@ class _patch(object): Klass = AsyncMock elif not_callable: Klass = NonCallableMagicMock + else: + Klass = MagicMock + else: + Klass = MagicMock + _kwargs = {} if spec is not None: _kwargs['spec'] = spec if spec_set is not None: |