Skip to content

AttributeError from stopping stopped patch which was started more than once #104745

Closed
@Red4Ru

Description

@Red4Ru

Bug report

It seems, such bug appeared after 4b222c9
Suppose we have initialized patch, than call start more than once and than call stop more than once:

>>> from unittest import mock
... class Foo:
...     bar = None
... patch = mock.patch.object(Foo, 'bar', 'x')
>>> patch.start()
'x'
>>> patch.start()
'x'
>>> patch.stop()
False
>>> patch.stop()
Traceback (most recent call last):
  File "...", line ..., in runcode
    coro = func()
  File "<input>", line 1, in <module>
  File "/usr/lib/python3.8/unittest/mock.py", line 1542, in stop
    return self.__exit__(None, None, None)
  File "/usr/lib/python3.8/unittest/mock.py", line 1508, in __exit__
    if self.is_local and self.temp_original is not DEFAULT:
AttributeError: '_patch' object has no attribute 'is_local'

But if we call start only once, multiple stops won't cause such error.
For a first glance it is due to stop excepting ValueError on removing patch from _active_patches and if ValueError was not raised it proceeds assuming patch have attribute is_local.

Your environment

  • CPython versions tested on: Python 3.8
  • Operating system: Ubuntu
  • I think error exists in newer versions too

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    stdlibPython modules in the Lib dirtype-bugAn unexpected behavior, bug, or error

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions