diff options
author | Tomas R <tomas.roun8@gmail.com> | 2023-04-13 07:37:57 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-13 07:37:57 (GMT) |
commit | 59e0de4903c02e72b329e505fddf1ad9794928bc (patch) | |
tree | 25631df423f943fc427f277eda233af8ccdfa87e /Lib/unittest | |
parent | 19d2639d1e6478e2e251479d842bdfa2e8272396 (diff) | |
download | cpython-59e0de4903c02e72b329e505fddf1ad9794928bc.zip cpython-59e0de4903c02e72b329e505fddf1ad9794928bc.tar.gz cpython-59e0de4903c02e72b329e505fddf1ad9794928bc.tar.bz2 |
gh-102978: Fix mock.patch function signatures for class and staticmethod decorators (#103228)
Fixes unittest.mock.patch not enforcing function signatures for methods
decorated with @classmethod or @staticmethod when patch is called with
autospec=True.
Diffstat (limited to 'Lib/unittest')
-rw-r--r-- | Lib/unittest/mock.py | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 0f93cb5..7ca0857 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -98,6 +98,12 @@ def _get_signature_object(func, as_instance, eat_self): func = func.__init__ # Skip the `self` argument in __init__ eat_self = True + elif isinstance(func, (classmethod, staticmethod)): + if isinstance(func, classmethod): + # Skip the `cls` argument of a class method + eat_self = True + # Use the original decorated method to extract the correct function signature + func = func.__func__ elif not isinstance(func, FunctionTypes): # If we really want to model an instance of the passed type, # __call__ should be looked up, not __init__. |