jsatt / mock

Automatically exported from code.google.com/p/mock
BSD 2-Clause "Simplified" License
0 stars 0 forks source link

mock patch autospec doesn't work on staticmethods #241

Open GoogleCodeExporter opened 8 years ago

GoogleCodeExporter commented 8 years ago
This is a copy of the bug I filed on the python issuetracker here[1]. I 
apologize if I filed in the wrong place. I'm not sure which is the correct 
tracker for this library.

If one of the mock.patch methods is used with autospec=True on a staticmethod 
in an object, the mock library determines that it is not callable by checking 
for the __call__ attribute. This results in a NonCallableMagicMock being 
returned which of course dies with the following error when the mocked method 
is called:

TypeError: 'NonCallableMagicMock' object is not callable

It seems that the create_autospec needs to special case for classmethod and 
staticmethod.

The following change seems to fix it, however I am only vaguely familiar with 
the internals of mock so I'm not sure what this breaks.

diff -r d356250e275d mock.py
--- a/mock.py   Tue Apr 09 14:53:33 2013 +0100
+++ b/mock.py   Wed Dec 17 07:35:15 2014 -0800
@@ -2191,7 +2191,8 @@
         # descriptors don't have a spec
         # because we don't know what type they return
         _kwargs = {}
-    elif not _callable(spec):
+    elif not _callable(spec) and not isinstance(spec, (staticmethod,
+                                                       classmethod)):
         Klass = NonCallableMagicMock
     elif is_type and instance and not _instance_callable(spec):
         Klass = NonCallableMagicMock

1. http://bugs.python.org/issue23078

Original issue reported on code.google.com by blak...@gmail.com on 18 Dec 2014 at 8:48