<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
On 29/07/2011 17:31, Tom Davis wrote:
<blockquote cite="mid:4E32E070.3060400@recursivedream.com"
type="cite">
<meta http-equiv="content-type" content="text/html;
charset=ISO-8859-1">
Hey all,<br>
<br>
I've been using Michael Foord's awesome <i>mock</i> package and
I've loved it... now I'm running into an issue. I'm patching a
class, pretty simple:<br>
<blockquote>from my.module.path import Class<br>
patch = mock.patch('my.module.path.Class', spec=Class)<br>
mocked = patch.start()<br>
mocked.return_value = MyReplacementClass()<br>
</blockquote>
I'm doing things this way because I need to mock out a class, but
provide an alternate implementation that uses similar logic to the
real class (basically mocking an external API by turning it into a
memory-mapped API).<br>
<br>
Somewhere else, my code gets this mock client and a function
calls:<br>
<blockquote>isinstance(client, my.module.path.Class): ...<br>
</blockquote>
This call fails with:<br>
<blockquote>TypeError: isinstance() arg 2 must be a class, type,
or tuple of classes and type<br>
</blockquote>
This was confusing to me, so I did a bit of digging to figure out
what <i>Class</i> really was, but all was well. Here's what I
got:<br>
<blockquote><MagicMock spec='Class' id='50389456'><br>
</blockquote>
</blockquote>
<br>
Well yes - what you have here is a mock *instance* - it isn't a
class it's a mock of a class. So you can't use this as the second
argument to isinstance. This is one of the problems with type
checking (not that it's always wrong - just that it causes this kind
of difficulty).<br>
<br>
Actually it *would* be possible to make a mock object behave like a
class, by providing __bases__ = (type,) on mock instances (or
whatever the appropriate bases would be).<br>
<br>
Can you add this as a feature request:<br>
<br>
<a class="moz-txt-link-freetext" href="https://code.google.com/p/mock/issues/list">https://code.google.com/p/mock/issues/list</a><br>
<br>
All the best,<br>
<br>
Michael Foord<br>
<blockquote cite="mid:4E32E070.3060400@recursivedream.com"
type="cite">
<blockquote> </blockquote>
Seems right to me! Additionally, if I change the instance check in
the production code to:<br>
<blockquote>isinstance(client, my.module.path.Class._spec_class):
...<br>
</blockquote>
It works just fine! I can't do this for obvious reasons, but it
seems to prove that the MagicMock at least has the correct
information somewhere, it's just not being properly inspected by
isinstance().<br>
<br>
Any thoughts? I really need this to work.<br>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
testing-in-python mailing list
<a class="moz-txt-link-abbreviated" href="mailto:testing-in-python@lists.idyll.org">testing-in-python@lists.idyll.org</a>
<a class="moz-txt-link-freetext" href="http://lists.idyll.org/listinfo/testing-in-python">http://lists.idyll.org/listinfo/testing-in-python</a>
</pre>
</blockquote>
<br>
<br>
<pre class="moz-signature" cols="72">--
<a class="moz-txt-link-freetext" href="http://www.voidspace.org.uk/">http://www.voidspace.org.uk/</a>
May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
-- the sqlite blessing <a class="moz-txt-link-freetext" href="http://www.sqlite.org/different.html">http://www.sqlite.org/different.html</a>
</pre>
</body>
</html>