<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
On 07/29/2011 12:42 PM, Michael Foord wrote:
<blockquote cite="mid:4E32E2E7.1030804@voidspace.org.uk" type="cite">
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
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>
</blockquote>
First off, thanks for the super fast reply! I'm trying to wrap up
this project and the intricacies of the final patching stage are
confusing me a bit. So if I understand this correctly, you're saying
that isinstance() is actually calling (or otherwise obtaining what i
set as "return_value") the mock? The result would make sense, then,
though I thought it just checked its type? This is a bit above my
meta-Python experience.<br>
<blockquote cite="mid:4E32E2E7.1030804@voidspace.org.uk" type="cite">
<br>
Can you add this as a feature request:<br>
<br>
<a moz-do-not-send="true" 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>
</blockquote>
Provided I actually understand what it is (see above), I certainly
will.<br>
<br>
Thanks again!<br>
<br>
-Tom<br>
<blockquote cite="mid:4E32E2E7.1030804@voidspace.org.uk" type="cite">
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 moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:testing-in-python@lists.idyll.org">testing-in-python@lists.idyll.org</a>
<a moz-do-not-send="true" 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 moz-do-not-send="true" 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 moz-do-not-send="true" class="moz-txt-link-freetext" href="http://www.sqlite.org/different.html">http://www.sqlite.org/different.html</a>
</pre>
</blockquote>
<br>
</body>
</html>