From e58a562d9395b8a4ed9419b735cad9f78c8ae802 Mon Sep 17 00:00:00 2001 From: Michael Foord Date: Sun, 25 Mar 2012 19:53:18 +0100 Subject: unittest.mock: a mock created by patch with a spec as the list argument will be callable if __call__ is in the spec --- Lib/unittest/mock.py | 9 ++++++++- Lib/unittest/test/testmock/testpatch.py | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index d73bd53..4809dba 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -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: diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index 204a30a..6256855 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -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() -- cgit v0.12