<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>&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>
    </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>
      &nbsp;&nbsp;&nbsp; <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>