python/mock-1.0.0/html/magicmock.html

Wed, 31 Dec 2014 07:22:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:22:50 +0100
branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
permissions
-rw-r--r--

Correct previous dual key logic pending first delivery installment.

     2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     3   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     6 <html xmlns="http://www.w3.org/1999/xhtml">
     7   <head>
     8     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    10     <title>Mocking Magic Methods &mdash; Mock 1.0.0 documentation</title>
    12     <link rel="stylesheet" href="_static/nature.css" type="text/css" />
    13     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    15     <script type="text/javascript">
    16       var DOCUMENTATION_OPTIONS = {
    17         URL_ROOT:    '',
    18         VERSION:     '1.0.0',
    19         COLLAPSE_INDEX: false,
    20         FILE_SUFFIX: '.html',
    21         HAS_SOURCE:  true
    22       };
    23     </script>
    24     <script type="text/javascript" src="_static/jquery.js"></script>
    25     <script type="text/javascript" src="_static/underscore.js"></script>
    26     <script type="text/javascript" src="_static/doctools.js"></script>
    27     <link rel="top" title="Mock 1.0.0 documentation" href="index.html" />
    28     <link rel="next" title="Getting Started with Mock" href="getting-started.html" />
    29     <link rel="prev" title="Sentinel" href="sentinel.html" /> 
    30   </head>
    31   <body>
    32     <div class="related">
    33       <h3>Navigation</h3>
    34       <ul>
    35         <li class="right" style="margin-right: 10px">
    36           <a href="genindex.html" title="General Index"
    37              accesskey="I">index</a></li>
    38         <li class="right" >
    39           <a href="getting-started.html" title="Getting Started with Mock"
    40              accesskey="N">next</a> |</li>
    41         <li class="right" >
    42           <a href="sentinel.html" title="Sentinel"
    43              accesskey="P">previous</a> |</li>
    44         <li><a href="index.html">Mock 1.0.0 documentation</a> &raquo;</li> 
    45       </ul>
    46     </div>  
    48     <div class="document">
    49       <div class="documentwrapper">
    50         <div class="bodywrapper">
    51           <div class="body">
    53   <div class="section" id="mocking-magic-methods">
    54 <span id="magic-methods"></span><h1>Mocking Magic Methods<a class="headerlink" href="#mocking-magic-methods" title="Permalink to this headline">¶</a></h1>
    55 <p><a class="reference internal" href="mock.html#mock.Mock" title="mock.Mock"><tt class="xref py py-class docutils literal"><span class="pre">Mock</span></tt></a> supports mocking <a class="reference external" href="http://www.ironpythoninaction.com/magic-methods.html">magic methods</a>. This allows mock
    56 objects to replace containers or other objects that implement Python
    57 protocols.</p>
    58 <p>Because magic methods are looked up differently from normal methods <a class="footnote-reference" href="#id4" id="id2">[1]</a>, this
    59 support has been specially implemented. This means that only specific magic
    60 methods are supported. The supported list includes <em>almost</em> all of them. If
    61 there are any missing that you need please let us know!</p>
    62 <p>You mock magic methods by setting the method you are interested in to a function
    63 or a mock instance. If you are using a function then it <em>must</em> take <tt class="docutils literal"><span class="pre">self</span></tt> as
    64 the first argument <a class="footnote-reference" href="#id5" id="id3">[2]</a>.</p>
    65 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
    66 <span class="gp">... </span>    <span class="k">return</span> <span class="s">&#39;fooble&#39;</span>
    67 <span class="gp">...</span>
    68 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
    69 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__str__</span> <span class="o">=</span> <span class="n">__str__</span>
    70 <span class="gp">&gt;&gt;&gt; </span><span class="nb">str</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
    71 <span class="go">&#39;fooble&#39;</span>
    73 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
    74 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__str__</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
    75 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__str__</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="s">&#39;fooble&#39;</span>
    76 <span class="gp">&gt;&gt;&gt; </span><span class="nb">str</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
    77 <span class="go">&#39;fooble&#39;</span>
    79 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
    80 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__iter__</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="nb">iter</span><span class="p">([]))</span>
    81 <span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
    82 <span class="go">[]</span>
    83 </pre></div>
    84 </div>
    85 <p>One use case for this is for mocking objects used as context managers in a
    86 <cite>with</cite> statement:</p>
    87 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
    88 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__enter__</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="s">&#39;foo&#39;</span><span class="p">)</span>
    89 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__exit__</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    90 <span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="n">mock</span> <span class="k">as</span> <span class="n">m</span><span class="p">:</span>
    91 <span class="gp">... </span>    <span class="k">assert</span> <span class="n">m</span> <span class="o">==</span> <span class="s">&#39;foo&#39;</span>
    92 <span class="gp">...</span>
    93 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__enter__</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">()</span>
    94 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__exit__</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
    95 </pre></div>
    96 </div>
    97 <p>Calls to magic methods do not appear in <a class="reference internal" href="mock.html#mock.Mock.method_calls" title="mock.Mock.method_calls"><tt class="xref py py-attr docutils literal"><span class="pre">method_calls</span></tt></a>, but they
    98 are recorded in <a class="reference internal" href="mock.html#mock.Mock.mock_calls" title="mock.Mock.mock_calls"><tt class="xref py py-attr docutils literal"><span class="pre">mock_calls</span></tt></a>.</p>
    99 <div class="admonition note">
   100 <p class="first admonition-title">Note</p>
   101 <p class="last">If you use the <cite>spec</cite> keyword argument to create a mock then attempting to
   102 set a magic method that isn&#8217;t in the spec will raise an <cite>AttributeError</cite>.</p>
   103 </div>
   104 <p>The full list of supported magic methods is:</p>
   105 <ul class="simple">
   106 <li><tt class="docutils literal"><span class="pre">__hash__</span></tt>, <tt class="docutils literal"><span class="pre">__sizeof__</span></tt>, <tt class="docutils literal"><span class="pre">__repr__</span></tt> and <tt class="docutils literal"><span class="pre">__str__</span></tt></li>
   107 <li><tt class="docutils literal"><span class="pre">__dir__</span></tt>, <tt class="docutils literal"><span class="pre">__format__</span></tt> and <tt class="docutils literal"><span class="pre">__subclasses__</span></tt></li>
   108 <li><tt class="docutils literal"><span class="pre">__floor__</span></tt>, <tt class="docutils literal"><span class="pre">__trunc__</span></tt> and <tt class="docutils literal"><span class="pre">__ceil__</span></tt></li>
   109 <li>Comparisons: <tt class="docutils literal"><span class="pre">__cmp__</span></tt>, <tt class="docutils literal"><span class="pre">__lt__</span></tt>, <tt class="docutils literal"><span class="pre">__gt__</span></tt>, <tt class="docutils literal"><span class="pre">__le__</span></tt>, <tt class="docutils literal"><span class="pre">__ge__</span></tt>,
   110 <tt class="docutils literal"><span class="pre">__eq__</span></tt> and <tt class="docutils literal"><span class="pre">__ne__</span></tt></li>
   111 <li>Container methods: <tt class="docutils literal"><span class="pre">__getitem__</span></tt>, <tt class="docutils literal"><span class="pre">__setitem__</span></tt>, <tt class="docutils literal"><span class="pre">__delitem__</span></tt>,
   112 <tt class="docutils literal"><span class="pre">__contains__</span></tt>, <tt class="docutils literal"><span class="pre">__len__</span></tt>, <tt class="docutils literal"><span class="pre">__iter__</span></tt>, <tt class="docutils literal"><span class="pre">__getslice__</span></tt>,
   113 <tt class="docutils literal"><span class="pre">__setslice__</span></tt>, <tt class="docutils literal"><span class="pre">__reversed__</span></tt> and <tt class="docutils literal"><span class="pre">__missing__</span></tt></li>
   114 <li>Context manager: <tt class="docutils literal"><span class="pre">__enter__</span></tt> and <tt class="docutils literal"><span class="pre">__exit__</span></tt></li>
   115 <li>Unary numeric methods: <tt class="docutils literal"><span class="pre">__neg__</span></tt>, <tt class="docutils literal"><span class="pre">__pos__</span></tt> and <tt class="docutils literal"><span class="pre">__invert__</span></tt></li>
   116 <li>The numeric methods (including right hand and in-place variants):
   117 <tt class="docutils literal"><span class="pre">__add__</span></tt>, <tt class="docutils literal"><span class="pre">__sub__</span></tt>, <tt class="docutils literal"><span class="pre">__mul__</span></tt>, <tt class="docutils literal"><span class="pre">__div__</span></tt>,
   118 <tt class="docutils literal"><span class="pre">__floordiv__</span></tt>, <tt class="docutils literal"><span class="pre">__mod__</span></tt>, <tt class="docutils literal"><span class="pre">__divmod__</span></tt>, <tt class="docutils literal"><span class="pre">__lshift__</span></tt>,
   119 <tt class="docutils literal"><span class="pre">__rshift__</span></tt>, <tt class="docutils literal"><span class="pre">__and__</span></tt>, <tt class="docutils literal"><span class="pre">__xor__</span></tt>, <tt class="docutils literal"><span class="pre">__or__</span></tt>, and <tt class="docutils literal"><span class="pre">__pow__</span></tt></li>
   120 <li>Numeric conversion methods: <tt class="docutils literal"><span class="pre">__complex__</span></tt>, <tt class="docutils literal"><span class="pre">__int__</span></tt>, <tt class="docutils literal"><span class="pre">__float__</span></tt>,
   121 <tt class="docutils literal"><span class="pre">__index__</span></tt> and <tt class="docutils literal"><span class="pre">__coerce__</span></tt></li>
   122 <li>Descriptor methods: <tt class="docutils literal"><span class="pre">__get__</span></tt>, <tt class="docutils literal"><span class="pre">__set__</span></tt> and <tt class="docutils literal"><span class="pre">__delete__</span></tt></li>
   123 <li>Pickling: <tt class="docutils literal"><span class="pre">__reduce__</span></tt>, <tt class="docutils literal"><span class="pre">__reduce_ex__</span></tt>, <tt class="docutils literal"><span class="pre">__getinitargs__</span></tt>,
   124 <tt class="docutils literal"><span class="pre">__getnewargs__</span></tt>, <tt class="docutils literal"><span class="pre">__getstate__</span></tt> and <tt class="docutils literal"><span class="pre">__setstate__</span></tt></li>
   125 </ul>
   126 <p>The following methods are supported in Python 2 but don&#8217;t exist in Python 3:</p>
   127 <ul class="simple">
   128 <li><tt class="docutils literal"><span class="pre">__unicode__</span></tt>, <tt class="docutils literal"><span class="pre">__long__</span></tt>, <tt class="docutils literal"><span class="pre">__oct__</span></tt>, <tt class="docutils literal"><span class="pre">__hex__</span></tt> and <tt class="docutils literal"><span class="pre">__nonzero__</span></tt></li>
   129 <li><tt class="docutils literal"><span class="pre">__truediv__</span></tt> and <tt class="docutils literal"><span class="pre">__rtruediv__</span></tt></li>
   130 </ul>
   131 <p>The following methods are supported in Python 3 but don&#8217;t exist in Python 2:</p>
   132 <ul class="simple">
   133 <li><tt class="docutils literal"><span class="pre">__bool__</span></tt> and <tt class="docutils literal"><span class="pre">__next__</span></tt></li>
   134 </ul>
   135 <p>The following methods exist but are <em>not</em> supported as they are either in use by
   136 mock, can&#8217;t be set dynamically, or can cause problems:</p>
   137 <ul class="simple">
   138 <li><tt class="docutils literal"><span class="pre">__getattr__</span></tt>, <tt class="docutils literal"><span class="pre">__setattr__</span></tt>, <tt class="docutils literal"><span class="pre">__init__</span></tt> and <tt class="docutils literal"><span class="pre">__new__</span></tt></li>
   139 <li><tt class="docutils literal"><span class="pre">__prepare__</span></tt>, <tt class="docutils literal"><span class="pre">__instancecheck__</span></tt>, <tt class="docutils literal"><span class="pre">__subclasscheck__</span></tt>, <tt class="docutils literal"><span class="pre">__del__</span></tt></li>
   140 </ul>
   141 </div>
   142 <div class="section" id="magic-mock">
   143 <h1>Magic Mock<a class="headerlink" href="#magic-mock" title="Permalink to this headline">¶</a></h1>
   144 <p>There are two <cite>MagicMock</cite> variants: <cite>MagicMock</cite> and <cite>NonCallableMagicMock</cite>.</p>
   145 <dl class="class">
   146 <dt id="mock.MagicMock">
   147 <em class="property">class </em><tt class="descname">MagicMock</tt><big>(</big><em>*args</em>, <em>**kw</em><big>)</big><a class="headerlink" href="#mock.MagicMock" title="Permalink to this definition">¶</a></dt>
   148 <dd><p><tt class="docutils literal"><span class="pre">MagicMock</span></tt> is a subclass of <a class="reference internal" href="mock.html#mock.Mock" title="mock.Mock"><tt class="xref py py-class docutils literal"><span class="pre">Mock</span></tt></a> with default implementations
   149 of most of the magic methods. You can use <tt class="docutils literal"><span class="pre">MagicMock</span></tt> without having to
   150 configure the magic methods yourself.</p>
   151 <p>The constructor parameters have the same meaning as for <a class="reference internal" href="mock.html#mock.Mock" title="mock.Mock"><tt class="xref py py-class docutils literal"><span class="pre">Mock</span></tt></a>.</p>
   152 <p>If you use the <cite>spec</cite> or <cite>spec_set</cite> arguments then <em>only</em> magic methods
   153 that exist in the spec will be created.</p>
   154 </dd></dl>
   156 <dl class="class">
   157 <dt id="mock.NonCallableMagicMock">
   158 <em class="property">class </em><tt class="descname">NonCallableMagicMock</tt><big>(</big><em>*args</em>, <em>**kw</em><big>)</big><a class="headerlink" href="#mock.NonCallableMagicMock" title="Permalink to this definition">¶</a></dt>
   159 <dd><p>A non-callable version of <cite>MagicMock</cite>.</p>
   160 <p>The constructor parameters have the same meaning as for
   161 <a class="reference internal" href="#mock.MagicMock" title="mock.MagicMock"><tt class="xref py py-class docutils literal"><span class="pre">MagicMock</span></tt></a>, with the exception of <cite>return_value</cite> and
   162 <cite>side_effect</cite> which have no meaning on a non-callable mock.</p>
   163 </dd></dl>
   165 <p>The magic methods are setup with <cite>MagicMock</cite> objects, so you can configure them
   166 and use them in the usual way:</p>
   167 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">()</span>
   168 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;fish&#39;</span>
   169 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__setitem__</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="s">&#39;fish&#39;</span><span class="p">)</span>
   170 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__getitem__</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="s">&#39;result&#39;</span>
   171 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
   172 <span class="go">&#39;result&#39;</span>
   173 </pre></div>
   174 </div>
   175 <p>By default many of the protocol methods are required to return objects of a
   176 specific type. These methods are preconfigured with a default return value, so
   177 that they can be used without you having to do anything if you aren&#8217;t interested
   178 in the return value. You can still <em>set</em> the return value manually if you want
   179 to change the default.</p>
   180 <p>Methods and their defaults:</p>
   181 <ul class="simple">
   182 <li><tt class="docutils literal"><span class="pre">__lt__</span></tt>: NotImplemented</li>
   183 <li><tt class="docutils literal"><span class="pre">__gt__</span></tt>: NotImplemented</li>
   184 <li><tt class="docutils literal"><span class="pre">__le__</span></tt>: NotImplemented</li>
   185 <li><tt class="docutils literal"><span class="pre">__ge__</span></tt>: NotImplemented</li>
   186 <li><tt class="docutils literal"><span class="pre">__int__</span></tt> : 1</li>
   187 <li><tt class="docutils literal"><span class="pre">__contains__</span></tt> : False</li>
   188 <li><tt class="docutils literal"><span class="pre">__len__</span></tt> : 1</li>
   189 <li><tt class="docutils literal"><span class="pre">__iter__</span></tt> : iter([])</li>
   190 <li><tt class="docutils literal"><span class="pre">__exit__</span></tt> : False</li>
   191 <li><tt class="docutils literal"><span class="pre">__complex__</span></tt> : 1j</li>
   192 <li><tt class="docutils literal"><span class="pre">__float__</span></tt> : 1.0</li>
   193 <li><tt class="docutils literal"><span class="pre">__bool__</span></tt> : True</li>
   194 <li><tt class="docutils literal"><span class="pre">__nonzero__</span></tt> : True</li>
   195 <li><tt class="docutils literal"><span class="pre">__oct__</span></tt> : &#8216;1&#8217;</li>
   196 <li><tt class="docutils literal"><span class="pre">__hex__</span></tt> : &#8216;0x1&#8217;</li>
   197 <li><tt class="docutils literal"><span class="pre">__long__</span></tt> : long(1)</li>
   198 <li><tt class="docutils literal"><span class="pre">__index__</span></tt> : 1</li>
   199 <li><tt class="docutils literal"><span class="pre">__hash__</span></tt> : default hash for the mock</li>
   200 <li><tt class="docutils literal"><span class="pre">__str__</span></tt> : default str for the mock</li>
   201 <li><tt class="docutils literal"><span class="pre">__unicode__</span></tt> : default unicode for the mock</li>
   202 <li><tt class="docutils literal"><span class="pre">__sizeof__</span></tt>: default sizeof for the mock</li>
   203 </ul>
   204 <p>For example:</p>
   205 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">()</span>
   206 <span class="gp">&gt;&gt;&gt; </span><span class="nb">int</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
   207 <span class="go">1</span>
   208 <span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
   209 <span class="go">0</span>
   210 <span class="gp">&gt;&gt;&gt; </span><span class="nb">hex</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
   211 <span class="go">&#39;0x1&#39;</span>
   212 <span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
   213 <span class="go">[]</span>
   214 <span class="gp">&gt;&gt;&gt; </span><span class="nb">object</span><span class="p">()</span> <span class="ow">in</span> <span class="n">mock</span>
   215 <span class="go">False</span>
   216 </pre></div>
   217 </div>
   218 <p>The two equality method, <cite>__eq__</cite> and <cite>__ne__</cite>, are special (changed in
   219 0.7.2). They do the default equality comparison on identity, using a side
   220 effect, unless you change their return value to return something else:</p>
   221 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">MagicMock</span><span class="p">()</span> <span class="o">==</span> <span class="mi">3</span>
   222 <span class="go">False</span>
   223 <span class="gp">&gt;&gt;&gt; </span><span class="n">MagicMock</span><span class="p">()</span> <span class="o">!=</span> <span class="mi">3</span>
   224 <span class="go">True</span>
   225 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">()</span>
   226 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__eq__</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="bp">True</span>
   227 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span> <span class="o">==</span> <span class="mi">3</span>
   228 <span class="go">True</span>
   229 </pre></div>
   230 </div>
   231 <p>In <cite>0.8</cite> the <cite>__iter__</cite> also gained special handling implemented with a
   232 side effect. The return value of <cite>MagicMock.__iter__</cite> can be any iterable
   233 object and isn&#8217;t required to be an iterator:</p>
   234 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">()</span>
   235 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__iter__</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;a&#39;</span><span class="p">,</span> <span class="s">&#39;b&#39;</span><span class="p">,</span> <span class="s">&#39;c&#39;</span><span class="p">]</span>
   236 <span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
   237 <span class="go">[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]</span>
   238 <span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
   239 <span class="go">[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]</span>
   240 </pre></div>
   241 </div>
   242 <p>If the return value <em>is</em> an iterator, then iterating over it once will consume
   243 it and subsequent iterations will result in an empty list:</p>
   244 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">__iter__</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">([</span><span class="s">&#39;a&#39;</span><span class="p">,</span> <span class="s">&#39;b&#39;</span><span class="p">,</span> <span class="s">&#39;c&#39;</span><span class="p">])</span>
   245 <span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
   246 <span class="go">[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]</span>
   247 <span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
   248 <span class="go">[]</span>
   249 </pre></div>
   250 </div>
   251 <p><tt class="docutils literal"><span class="pre">MagicMock</span></tt> has all of the supported magic methods configured except for some
   252 of the obscure and obsolete ones. You can still set these up if you want.</p>
   253 <p>Magic methods that are supported but not setup by default in <tt class="docutils literal"><span class="pre">MagicMock</span></tt> are:</p>
   254 <ul class="simple">
   255 <li><tt class="docutils literal"><span class="pre">__cmp__</span></tt></li>
   256 <li><tt class="docutils literal"><span class="pre">__getslice__</span></tt> and <tt class="docutils literal"><span class="pre">__setslice__</span></tt></li>
   257 <li><tt class="docutils literal"><span class="pre">__coerce__</span></tt></li>
   258 <li><tt class="docutils literal"><span class="pre">__subclasses__</span></tt></li>
   259 <li><tt class="docutils literal"><span class="pre">__dir__</span></tt></li>
   260 <li><tt class="docutils literal"><span class="pre">__format__</span></tt></li>
   261 <li><tt class="docutils literal"><span class="pre">__get__</span></tt>, <tt class="docutils literal"><span class="pre">__set__</span></tt> and <tt class="docutils literal"><span class="pre">__delete__</span></tt></li>
   262 <li><tt class="docutils literal"><span class="pre">__reversed__</span></tt> and <tt class="docutils literal"><span class="pre">__missing__</span></tt></li>
   263 <li><tt class="docutils literal"><span class="pre">__reduce__</span></tt>, <tt class="docutils literal"><span class="pre">__reduce_ex__</span></tt>, <tt class="docutils literal"><span class="pre">__getinitargs__</span></tt>, <tt class="docutils literal"><span class="pre">__getnewargs__</span></tt>,
   264 <tt class="docutils literal"><span class="pre">__getstate__</span></tt> and <tt class="docutils literal"><span class="pre">__setstate__</span></tt></li>
   265 <li><tt class="docutils literal"><span class="pre">__getformat__</span></tt> and <tt class="docutils literal"><span class="pre">__setformat__</span></tt></li>
   266 </ul>
   267 <hr class="docutils" />
   268 <table class="docutils footnote" frame="void" id="id4" rules="none">
   269 <colgroup><col class="label" /><col /></colgroup>
   270 <tbody valign="top">
   271 <tr><td class="label"><a class="fn-backref" href="#id2">[1]</a></td><td>Magic methods <em>should</em> be looked up on the class rather than the
   272 instance. Different versions of Python are inconsistent about applying this
   273 rule. The supported protocol methods should work with all supported versions
   274 of Python.</td></tr>
   275 </tbody>
   276 </table>
   277 <table class="docutils footnote" frame="void" id="id5" rules="none">
   278 <colgroup><col class="label" /><col /></colgroup>
   279 <tbody valign="top">
   280 <tr><td class="label"><a class="fn-backref" href="#id3">[2]</a></td><td>The function is basically hooked up to the class, but each <tt class="docutils literal"><span class="pre">Mock</span></tt>
   281 instance is kept isolated from the others.</td></tr>
   282 </tbody>
   283 </table>
   284 </div>
   287           </div>
   288         </div>
   289       </div>
   290       <div class="sphinxsidebar">
   291         <div class="sphinxsidebarwrapper">
   292   <h3><a href="index.html">Table Of Contents</a></h3>
   293   <ul>
   294 <li><a class="reference internal" href="#">Mocking Magic Methods</a></li>
   295 <li><a class="reference internal" href="#magic-mock">Magic Mock</a></li>
   296 </ul>
   298   <h4>Previous topic</h4>
   299   <p class="topless"><a href="sentinel.html"
   300                         title="previous chapter">Sentinel</a></p>
   301   <h4>Next topic</h4>
   302   <p class="topless"><a href="getting-started.html"
   303                         title="next chapter">Getting Started with Mock</a></p>
   304   <h3>This Page</h3>
   305   <ul class="this-page-menu">
   306     <li><a href="_sources/magicmock.txt"
   307            rel="nofollow">Show Source</a></li>
   308   </ul>
   309 <div id="searchbox" style="display: none">
   310   <h3>Quick search</h3>
   311     <form class="search" action="search.html" method="get">
   312       <input type="text" name="q" />
   313       <input type="submit" value="Go" />
   314       <input type="hidden" name="check_keywords" value="yes" />
   315       <input type="hidden" name="area" value="default" />
   316     </form>
   317     <p class="searchtip" style="font-size: 90%">
   318     Enter search terms or a module, class or function name.
   319     </p>
   320 </div>
   321 <script type="text/javascript">$('#searchbox').show(0);</script>
   322         </div>
   323       </div>
   324       <div class="clearer"></div>
   325     </div>
   326     <div class="related">
   327       <h3>Navigation</h3>
   328       <ul>
   329         <li class="right" style="margin-right: 10px">
   330           <a href="genindex.html" title="General Index"
   331              >index</a></li>
   332         <li class="right" >
   333           <a href="getting-started.html" title="Getting Started with Mock"
   334              >next</a> |</li>
   335         <li class="right" >
   336           <a href="sentinel.html" title="Sentinel"
   337              >previous</a> |</li>
   338         <li><a href="index.html">Mock 1.0.0 documentation</a> &raquo;</li> 
   339       </ul>
   340     </div>
   341     <div class="footer">
   342         &copy; Copyright 2007-2012, Michael Foord &amp; the mock team.
   343       Last updated on Oct 07, 2012.
   344       Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
   345     </div>
   346   </body>
   347 </html>

mercurial