Fix to work properly when @patch is used with new not equal to DEFAULT

also updated test_mock to include this situation
This commit is contained in:
Chris Gilling 2014-03-03 10:36:59 -08:00
parent 2893cddb68
commit 3388d82c1c
2 changed files with 10 additions and 1 deletions

View File

@ -1836,7 +1836,13 @@ def getfuncargnames(function, startindex=None):
if startindex is None: if startindex is None:
startindex = inspect.ismethod(function) and 1 or 0 startindex = inspect.ismethod(function) and 1 or 0
if realfunction != function: if realfunction != function:
startindex += len(getattr(function, "patchings", [])) try:
from mock import DEFAULT
for patching in getattr(function, "patchings", []):
if not patching.attribute_name and patching.new is DEFAULT:
startindex += 1
except ImportError:
startindex += len(getattr(function, "patchings", []))
function = realfunction function = realfunction
argnames = inspect.getargs(py.code.getrawcode(function))[0] argnames = inspect.getargs(py.code.getrawcode(function))[0]
defaults = getattr(function, 'func_defaults', defaults = getattr(function, 'func_defaults',

View File

@ -124,8 +124,11 @@ class TestMockDecoration:
def test_hello(self, abspath): def test_hello(self, abspath):
os.path.abspath("hello") os.path.abspath("hello")
abspath.assert_any_call("hello") abspath.assert_any_call("hello")
def mock_basename(path):
return "mock_basename"
@mock.patch("os.path.abspath") @mock.patch("os.path.abspath")
@mock.patch("os.path.normpath") @mock.patch("os.path.normpath")
@mock.patch("os.path.basename",new=mock_basename)
def test_someting(normpath, abspath, tmpdir): def test_someting(normpath, abspath, tmpdir):
abspath.return_value = "this" abspath.return_value = "this"
os.path.normpath(os.path.abspath("hello")) os.path.normpath(os.path.abspath("hello"))