[TIP] I don't get it?

Michael Foord fuzzyman at voidspace.org.uk
Tue Nov 2 09:17:42 PDT 2010


On 02/11/2010 15:34, WW wrote:
> 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)
>

You should still be able to use patch with a named function (as a 
string). See the other replies for an example.

> It doesn't seem to have any effect; I can call somemodule.somemethod 
> with any combination of invalid arguments and no exceptions are thrown. 

Using spec doesn't protect you against being called with invalid 
arguments. You should get an error when you validate that the calls were 
made correctly when you call 'assert_called_with'.

> 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__'
>

This is weird. The traceback implies that you are trying to replace a 
sentinel object using mocksignature (and sentinels don't have signatures 
to mock). Either that or it is a bug. I'll create a simple test case 
here (but this functionality *is* tested), but it looks like something 
is not quite setup how you expect.

All the best,

Michael Foord

> 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


-- 
http://www.voidspace.org.uk/

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.idyll.org/pipermail/testing-in-python/attachments/20101102/73aa6a95/attachment-0001.htm>


More information about the testing-in-python mailing list