<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
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>
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>
</body>
</html>