summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mocker.py20
-rwxr-xr-xtest.py23
2 files changed, 37 insertions, 6 deletions
diff --git a/mocker.py b/mocker.py
index 9463702..f31cf53 100644
--- a/mocker.py
+++ b/mocker.py
@@ -1581,13 +1581,19 @@ class SpecChecker(Task):
def __init__(self, method):
self._method = method
+ self._unsupported = False
+
if method:
- self._args, self._varargs, self._varkwargs, self._defaults = \
- inspect.getargspec(method)
- if self._defaults is None:
- self._defaults = ()
- if type(method) is type(self.run):
- self._args = self._args[1:]
+ try:
+ self._args, self._varargs, self._varkwargs, self._defaults = \
+ inspect.getargspec(method)
+ except TypeError:
+ self._unsupported = True
+ else:
+ if self._defaults is None:
+ self._defaults = ()
+ if type(method) is type(self.run):
+ self._args = self._args[1:]
def get_method(self):
return self._method
@@ -1601,6 +1607,8 @@ class SpecChecker(Task):
def run(self, path):
if not self._method:
raise AssertionError("Method not found in real specification")
+ if self._unsupported:
+ return # Can't check it. Happens with builtin functions. :-(
action = path.actions[-1]
obtained_len = len(action.args)
obtained_kwargs = action.kwargs.copy()
diff --git a/test.py b/test.py
index 19b132b..2d74217 100755
--- a/test.py
+++ b/test.py
@@ -211,6 +211,18 @@ class IntegrationTest(unittest.TestCase):
self.assertEquals(list(mock), [1, 2, 3])
self.mocker.verify()
+ def test_replace_builtin_function(self):
+ """
+ Inspection doesn't work on builtin functions, but proxying should
+ work even then (without spec enforcement in these cases).
+ """
+ from zlib import adler32
+ mock = self.mocker.proxy(adler32)
+ mock()
+ self.mocker.result(42)
+ self.mocker.replay()
+ self.assertEquals(mock(), 42)
+
class ExpectTest(unittest.TestCase):
@@ -2644,6 +2656,17 @@ class SpecCheckerTest(unittest.TestCase):
else:
self.fail("AssertionError not raised")
+ def test_unsupported_object_for_getargspec(self):
+ from zlib import adler32
+ # If that fails, this test has to change because either adler32 has
+ # changed, or the implementation of getargspec has changed.
+ self.assertRaises(TypeError, inspect.getargspec, adler32)
+ try:
+ task = SpecChecker(adler32)
+ task.run(self.path("asd"))
+ except TypeError, e:
+ self.fail("TypeError: %s" % str(e))
+
def test_recorder(self):
self.mocker.add_recorder(spec_checker_recorder)
obj = self.mocker.mock(spec=self.cls)