cpython icon indicating copy to clipboard operation
cpython copied to clipboard

unittest.mock.create_autospec() can crash when accessing properties from objects

Open joaoe opened this issue 3 years ago • 2 comments

Bug report

This crashes. It should not.

from unittest.mock import create_autospec

class X:
    @property
    def myprop(self):
        raise Exception("some bug")

create_autospec(X())

Now you could tell for me to fix X. The problem though is that in my project the problem is much more complex. X is some other class that is being autospeced and the getter touches some mock objects it does not like.

Your environment

  • CPython versions tested on: 3.10
  • Operating system and architecture: Windows

Fix

--- a\unittest\mock.py
+++ b\unittest\mock.py
         for attr in dir(spec):
-            if iscoroutinefunction(getattr(spec, attr, None)):
-                _spec_asyncs.append(attr)
+            try::
+                value = getattr(spec, attr, None)
+            except:
+                pass
+            else:
+                if iscoroutinefunction(value):
+                    _spec_asyncs.append(attr)

joaoe avatar Oct 15 '22 21:10 joaoe

See https://github.com/python/cpython/pull/29901

sobolevn avatar Oct 16 '22 14:10 sobolevn

Right now property execution is "by design".

sobolevn avatar Oct 16 '22 14:10 sobolevn

I don't think property execution is by design. Historically, properties were not executed by creation of a specced Mock. The execution of properties was introduced relatively recently (3.8) along with AsyncMock, not intentionally but as an accidental side effect of looking for async methods. This was a backwards incompatible change at the time, and reported reasonably promptly in #85934. Although we've failed to fix it promptly, it should still be fixed and restored to the long-term established behavior.

I don't think exception-catching is the right answer though; rather we should do something like #22209 to avoid executing the properties in the first place.

Closing as duplicate of #85934.

carljm avatar May 05 '23 18:05 carljm