[TIP] I don't get it?

Michael Foord fuzzyman at voidspace.org.uk
Tue Nov 2 09:13:35 PDT 2010

On 02/11/2010 15:55, vanderson.mota at gmail.com wrote:
> why don't you use:
> @patch('somemodule.somefunction', spec=True)
> def test_spam(self, somefunctionmock):
>     ... some code ...
>     somefunctionmock.assert_called_with(expected_param)
This is the generally correct way to use patch to replace a function in 
a module.  mocksignature=True instead of spec=True may be useful too. As 
mocksignature replaces the original with a generated function object 
that delegates to a mock using both is superfluous.

The original poster didn't give quite enough detail to diagnose why 
"patch.object" didn't work for him (it *should* still work), but we'll 
see if this solution is sufficient for him.

The traceback *looks* like a bug (where is that sentinel coming from?). 
I'll try and reproduce it,  but I may need more details.

All the best,

Michael Foord

> cheers!
> 2010/11/2 WW<teetee at gmail.com>:
>> Hello,
>> This is my first time using the python mock library and I'm a little
>> confused.  I'd like to provide some guarantees that my mocks are being
>> called with the correct number of arguments.  The documentation seems to
>> indicate there are two ways to do this, "spec" and "mocksignature", but it's
>> a little unclear to me what the difference is supposed to be between them.
>> I find myself using the @patch.object decorator almost all the time, because
>> the modules I'm testing use a lot of top-level functions from modules
>> they've imported.  When I do something like this:
>> @patch.object(somemodule, 'somemethod', spec=True)
>> It doesn't seem to have any effect; I can call somemodule.somemethod with
>> any combination of invalid arguments and no exceptions are thrown.  However,
>> when I do:
>> @patch.object(somemodule, 'somemethod', mocksignature=True)
>> I get:
>> Traceback (most recent call last):
>>    File "/usr/lib/python2.6/site-
>> packages/mock-0.7.0b3-py2.6.egg/mock.py", line 485, in patched
>>      arg = patching.__enter__()
>>    File "/usr/lib/python2.6/site-packages/mock-0.7.0b3-py2.6.egg/mock.py",
>> line 536, in __enter__
>>      new_attr = mocksignature(original, new)
>>    File "/usr/lib/python2.6/site-packages/mock-0.7.0b3-py2.6.egg/mock.py",
>> line 140, in mocksignature
>>      signature, func = _getsignature(func, skipfirst)
>>    File "/usr/lib/python2.6/site-packages/mock-0.7.0b3-py2.6.egg/mock.py",
>> line 87, in _getsignature
>>      func = func.__call__
>> AttributeError: 'SentinelObject' object has no attribute '__call__'
>> What am I missing here?
>> Thanks for your help.
>> _______________________________________________
>> testing-in-python mailing list
>> testing-in-python at lists.idyll.org
>> http://lists.idyll.org/listinfo/testing-in-python


More information about the testing-in-python mailing list