unittest.mock: a mock created by patch with a spec as the list argument will be callable if __call__ is in the spec

This commit is contained in:
Michael Foord 2012-03-25 19:53:18 +01:00
parent 87b3caf873
commit e58a562d93
2 changed files with 28 additions and 1 deletions

View File

@ -1166,7 +1166,14 @@ class _patch(object):
if new_callable is not None:
Klass = new_callable
elif spec is not None or spec_set is not None:
if not _callable(spec or spec_set):
this_spec = spec
if spec_set is not None:
this_spec = spec_set
if _is_list(this_spec):
not_callable = '__call__' not in this_spec
else:
not_callable = not callable(this_spec)
if not_callable:
Klass = NonCallableMagicMock
if spec is not None:

View File

@ -1742,6 +1742,26 @@ class PatchTest(unittest.TestCase):
p.stop()
def test_callable_spec_as_list(self):
spec = ('__call__',)
p = patch(MODNAME, spec=spec)
m = p.start()
try:
self.assertTrue(callable(m))
finally:
p.stop()
def test_not_callable_spec_as_list(self):
spec = ('foo', 'bar')
p = patch(MODNAME, spec=spec)
m = p.start()
try:
self.assertFalse(callable(m))
finally:
p.stop()
if __name__ == '__main__':
unittest.main()