<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>&lt;MagicMock spec='Class' id='50389456'&gt;<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>
    &nbsp;&nbsp;&nbsp; <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>