python/mock-1.0.0/html/getting-started.html

Wed, 31 Dec 2014 06:55:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:50 +0100
changeset 2
7e26c7da4463
permissions
-rw-r--r--

Added tag UPSTREAM_283F7C6 for changeset ca08bd8f51b2

michael@0 1
michael@0 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
michael@0 3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
michael@0 4
michael@0 5
michael@0 6 <html xmlns="http://www.w3.org/1999/xhtml">
michael@0 7 <head>
michael@0 8 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
michael@0 9
michael@0 10 <title>Getting Started with Mock &mdash; Mock 1.0.0 documentation</title>
michael@0 11
michael@0 12 <link rel="stylesheet" href="_static/nature.css" type="text/css" />
michael@0 13 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
michael@0 14
michael@0 15 <script type="text/javascript">
michael@0 16 var DOCUMENTATION_OPTIONS = {
michael@0 17 URL_ROOT: '',
michael@0 18 VERSION: '1.0.0',
michael@0 19 COLLAPSE_INDEX: false,
michael@0 20 FILE_SUFFIX: '.html',
michael@0 21 HAS_SOURCE: true
michael@0 22 };
michael@0 23 </script>
michael@0 24 <script type="text/javascript" src="_static/jquery.js"></script>
michael@0 25 <script type="text/javascript" src="_static/underscore.js"></script>
michael@0 26 <script type="text/javascript" src="_static/doctools.js"></script>
michael@0 27 <link rel="top" title="Mock 1.0.0 documentation" href="index.html" />
michael@0 28 <link rel="next" title="Further Examples" href="examples.html" />
michael@0 29 <link rel="prev" title="Mocking Magic Methods" href="magicmock.html" />
michael@0 30 </head>
michael@0 31 <body>
michael@0 32 <div class="related">
michael@0 33 <h3>Navigation</h3>
michael@0 34 <ul>
michael@0 35 <li class="right" style="margin-right: 10px">
michael@0 36 <a href="genindex.html" title="General Index"
michael@0 37 accesskey="I">index</a></li>
michael@0 38 <li class="right" >
michael@0 39 <a href="examples.html" title="Further Examples"
michael@0 40 accesskey="N">next</a> |</li>
michael@0 41 <li class="right" >
michael@0 42 <a href="magicmock.html" title="Mocking Magic Methods"
michael@0 43 accesskey="P">previous</a> |</li>
michael@0 44 <li><a href="index.html">Mock 1.0.0 documentation</a> &raquo;</li>
michael@0 45 </ul>
michael@0 46 </div>
michael@0 47
michael@0 48 <div class="document">
michael@0 49 <div class="documentwrapper">
michael@0 50 <div class="bodywrapper">
michael@0 51 <div class="body">
michael@0 52
michael@0 53 <div class="section" id="getting-started-with-mock">
michael@0 54 <h1>Getting Started with Mock<a class="headerlink" href="#getting-started-with-mock" title="Permalink to this headline">¶</a></h1>
michael@0 55 <span class="target" id="getting-started"></span><span class="target" id="index-0"></span><div class="section" id="using-mock">
michael@0 56 <h2>Using Mock<a class="headerlink" href="#using-mock" title="Permalink to this headline">¶</a></h2>
michael@0 57 <div class="section" id="mock-patching-methods">
michael@0 58 <h3>Mock Patching Methods<a class="headerlink" href="#mock-patching-methods" title="Permalink to this headline">¶</a></h3>
michael@0 59 <p>Common uses for <tt class="xref py py-class docutils literal"><span class="pre">Mock</span></tt> objects include:</p>
michael@0 60 <ul class="simple">
michael@0 61 <li>Patching methods</li>
michael@0 62 <li>Recording method calls on objects</li>
michael@0 63 </ul>
michael@0 64 <p>You might want to replace a method on an object to check that
michael@0 65 it is called with the correct arguments by another part of the system:</p>
michael@0 66 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">real</span> <span class="o">=</span> <span class="n">SomeClass</span><span class="p">()</span>
michael@0 67 <span class="gp">&gt;&gt;&gt; </span><span class="n">real</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;method&#39;</span><span class="p">)</span>
michael@0 68 <span class="gp">&gt;&gt;&gt; </span><span class="n">real</span><span class="o">.</span><span class="n">method</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s">&#39;value&#39;</span><span class="p">)</span>
michael@0 69 <span class="go">&lt;MagicMock name=&#39;method()&#39; id=&#39;...&#39;&gt;</span>
michael@0 70 </pre></div>
michael@0 71 </div>
michael@0 72 <p>Once our mock has been used (<cite>real.method</cite> in this example) it has methods
michael@0 73 and attributes that allow you to make assertions about how it has been used.</p>
michael@0 74 <div class="admonition note">
michael@0 75 <p class="first admonition-title">Note</p>
michael@0 76 <p class="last">In most of these examples the <tt class="xref py py-class docutils literal"><span class="pre">Mock</span></tt> and <tt class="xref py py-class docutils literal"><span class="pre">MagicMock</span></tt> classes
michael@0 77 are interchangeable. As the <cite>MagicMock</cite> is the more capable class it makes
michael@0 78 a sensible one to use by default.</p>
michael@0 79 </div>
michael@0 80 <p>Once the mock has been called its <tt class="xref py py-attr docutils literal"><span class="pre">called</span></tt> attribute is set to
michael@0 81 <cite>True</cite>. More importantly we can use the <tt class="xref py py-meth docutils literal"><span class="pre">assert_called_with()</span></tt> or
michael@0 82 <tt class="xref py py-meth docutils literal"><span class="pre">assert_called_once_with()</span></tt> method to check that it was called with
michael@0 83 the correct arguments.</p>
michael@0 84 <p>This example tests that calling <cite>ProductionClass().method</cite> results in a call to
michael@0 85 the <cite>something</cite> method:</p>
michael@0 86 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">mock</span> <span class="kn">import</span> <span class="n">MagicMock</span>
michael@0 87 <span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">ProductionClass</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
michael@0 88 <span class="gp">... </span> <span class="k">def</span> <span class="nf">method</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
michael@0 89 <span class="gp">... </span> <span class="bp">self</span><span class="o">.</span><span class="n">something</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
michael@0 90 <span class="gp">... </span> <span class="k">def</span> <span class="nf">something</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
michael@0 91 <span class="gp">... </span> <span class="k">pass</span>
michael@0 92 <span class="gp">...</span>
michael@0 93 <span class="gp">&gt;&gt;&gt; </span><span class="n">real</span> <span class="o">=</span> <span class="n">ProductionClass</span><span class="p">()</span>
michael@0 94 <span class="gp">&gt;&gt;&gt; </span><span class="n">real</span><span class="o">.</span><span class="n">something</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">()</span>
michael@0 95 <span class="gp">&gt;&gt;&gt; </span><span class="n">real</span><span class="o">.</span><span class="n">method</span><span class="p">()</span>
michael@0 96 <span class="gp">&gt;&gt;&gt; </span><span class="n">real</span><span class="o">.</span><span class="n">something</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
michael@0 97 </pre></div>
michael@0 98 </div>
michael@0 99 </div>
michael@0 100 <div class="section" id="mock-for-method-calls-on-an-object">
michael@0 101 <h3>Mock for Method Calls on an Object<a class="headerlink" href="#mock-for-method-calls-on-an-object" title="Permalink to this headline">¶</a></h3>
michael@0 102 <p>In the last example we patched a method directly on an object to check that it
michael@0 103 was called correctly. Another common use case is to pass an object into a
michael@0 104 method (or some part of the system under test) and then check that it is used
michael@0 105 in the correct way.</p>
michael@0 106 <p>The simple <cite>ProductionClass</cite> below has a <cite>closer</cite> method. If it is called with
michael@0 107 an object then it calls <cite>close</cite> on it.</p>
michael@0 108 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">ProductionClass</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
michael@0 109 <span class="gp">... </span> <span class="k">def</span> <span class="nf">closer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">something</span><span class="p">):</span>
michael@0 110 <span class="gp">... </span> <span class="n">something</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
michael@0 111 <span class="gp">...</span>
michael@0 112 </pre></div>
michael@0 113 </div>
michael@0 114 <p>So to test it we need to pass in an object with a <cite>close</cite> method and check
michael@0 115 that it was called correctly.</p>
michael@0 116 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">real</span> <span class="o">=</span> <span class="n">ProductionClass</span><span class="p">()</span>
michael@0 117 <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>
michael@0 118 <span class="gp">&gt;&gt;&gt; </span><span class="n">real</span><span class="o">.</span><span class="n">closer</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
michael@0 119 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">close</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">()</span>
michael@0 120 </pre></div>
michael@0 121 </div>
michael@0 122 <p>We don&#8217;t have to do any work to provide the &#8216;close&#8217; method on our mock.
michael@0 123 Accessing close creates it. So, if &#8216;close&#8217; hasn&#8217;t already been called then
michael@0 124 accessing it in the test will create it, but <tt class="xref py py-meth docutils literal"><span class="pre">assert_called_with()</span></tt>
michael@0 125 will raise a failure exception.</p>
michael@0 126 </div>
michael@0 127 <div class="section" id="mocking-classes">
michael@0 128 <h3>Mocking Classes<a class="headerlink" href="#mocking-classes" title="Permalink to this headline">¶</a></h3>
michael@0 129 <p>A common use case is to mock out classes instantiated by your code under test.
michael@0 130 When you patch a class, then that class is replaced with a mock. Instances
michael@0 131 are created by <em>calling the class</em>. This means you access the &#8220;mock instance&#8221;
michael@0 132 by looking at the return value of the mocked class.</p>
michael@0 133 <p>In the example below we have a function <cite>some_function</cite> that instantiates <cite>Foo</cite>
michael@0 134 and calls a method on it. The call to <cite>patch</cite> replaces the class <cite>Foo</cite> with a
michael@0 135 mock. The <cite>Foo</cite> instance is the result of calling the mock, so it is configured
michael@0 136 by modifying the mock <tt class="xref py py-attr docutils literal"><span class="pre">return_value</span></tt>.</p>
michael@0 137 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">some_function</span><span class="p">():</span>
michael@0 138 <span class="gp">... </span> <span class="n">instance</span> <span class="o">=</span> <span class="n">module</span><span class="o">.</span><span class="n">Foo</span><span class="p">()</span>
michael@0 139 <span class="gp">... </span> <span class="k">return</span> <span class="n">instance</span><span class="o">.</span><span class="n">method</span><span class="p">()</span>
michael@0 140 <span class="gp">...</span>
michael@0 141 <span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="n">patch</span><span class="p">(</span><span class="s">&#39;module.Foo&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock</span><span class="p">:</span>
michael@0 142 <span class="gp">... </span> <span class="n">instance</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">return_value</span>
michael@0 143 <span class="gp">... </span> <span class="n">instance</span><span class="o">.</span><span class="n">method</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="s">&#39;the result&#39;</span>
michael@0 144 <span class="gp">... </span> <span class="n">result</span> <span class="o">=</span> <span class="n">some_function</span><span class="p">()</span>
michael@0 145 <span class="gp">... </span> <span class="k">assert</span> <span class="n">result</span> <span class="o">==</span> <span class="s">&#39;the result&#39;</span>
michael@0 146 </pre></div>
michael@0 147 </div>
michael@0 148 </div>
michael@0 149 <div class="section" id="naming-your-mocks">
michael@0 150 <h3>Naming your mocks<a class="headerlink" href="#naming-your-mocks" title="Permalink to this headline">¶</a></h3>
michael@0 151 <p>It can be useful to give your mocks a name. The name is shown in the repr of
michael@0 152 the mock and can be helpful when the mock appears in test failure messages. The
michael@0 153 name is also propagated to attributes or methods of the mock:</p>
michael@0 154 <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><span class="n">name</span><span class="o">=</span><span class="s">&#39;foo&#39;</span><span class="p">)</span>
michael@0 155 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span>
michael@0 156 <span class="go">&lt;MagicMock name=&#39;foo&#39; id=&#39;...&#39;&gt;</span>
michael@0 157 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">method</span>
michael@0 158 <span class="go">&lt;MagicMock name=&#39;foo.method&#39; id=&#39;...&#39;&gt;</span>
michael@0 159 </pre></div>
michael@0 160 </div>
michael@0 161 </div>
michael@0 162 <div class="section" id="tracking-all-calls">
michael@0 163 <h3>Tracking all Calls<a class="headerlink" href="#tracking-all-calls" title="Permalink to this headline">¶</a></h3>
michael@0 164 <p>Often you want to track more than a single call to a method. The
michael@0 165 <tt class="xref py py-attr docutils literal"><span class="pre">mock_calls</span></tt> attribute records all calls
michael@0 166 to child attributes of the mock - and also to their children.</p>
michael@0 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>
michael@0 168 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">method</span><span class="p">()</span>
michael@0 169 <span class="go">&lt;MagicMock name=&#39;mock.method()&#39; id=&#39;...&#39;&gt;</span>
michael@0 170 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">attribute</span><span class="o">.</span><span class="n">method</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="mi">53</span><span class="p">)</span>
michael@0 171 <span class="go">&lt;MagicMock name=&#39;mock.attribute.method()&#39; id=&#39;...&#39;&gt;</span>
michael@0 172 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">mock_calls</span>
michael@0 173 <span class="go">[call.method(), call.attribute.method(10, x=53)]</span>
michael@0 174 </pre></div>
michael@0 175 </div>
michael@0 176 <p>If you make an assertion about <cite>mock_calls</cite> and any unexpected methods
michael@0 177 have been called, then the assertion will fail. This is useful because as well
michael@0 178 as asserting that the calls you expected have been made, you are also checking
michael@0 179 that they were made in the right order and with no additional calls:</p>
michael@0 180 <p>You use the <tt class="xref py py-data docutils literal"><span class="pre">call</span></tt> object to construct lists for comparing with
michael@0 181 <cite>mock_calls</cite>:</p>
michael@0 182 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">expected</span> <span class="o">=</span> <span class="p">[</span><span class="n">call</span><span class="o">.</span><span class="n">method</span><span class="p">(),</span> <span class="n">call</span><span class="o">.</span><span class="n">attribute</span><span class="o">.</span><span class="n">method</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="mi">53</span><span class="p">)]</span>
michael@0 183 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">mock_calls</span> <span class="o">==</span> <span class="n">expected</span>
michael@0 184 <span class="go">True</span>
michael@0 185 </pre></div>
michael@0 186 </div>
michael@0 187 </div>
michael@0 188 <div class="section" id="setting-return-values-and-attributes">
michael@0 189 <h3>Setting Return Values and Attributes<a class="headerlink" href="#setting-return-values-and-attributes" title="Permalink to this headline">¶</a></h3>
michael@0 190 <p>Setting the return values on a mock object is trivially easy:</p>
michael@0 191 <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>
michael@0 192 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="mi">3</span>
michael@0 193 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="p">()</span>
michael@0 194 <span class="go">3</span>
michael@0 195 </pre></div>
michael@0 196 </div>
michael@0 197 <p>Of course you can do the same for methods on the mock:</p>
michael@0 198 <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>
michael@0 199 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">method</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="mi">3</span>
michael@0 200 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">method</span><span class="p">()</span>
michael@0 201 <span class="go">3</span>
michael@0 202 </pre></div>
michael@0 203 </div>
michael@0 204 <p>The return value can also be set in the constructor:</p>
michael@0 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">Mock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
michael@0 206 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="p">()</span>
michael@0 207 <span class="go">3</span>
michael@0 208 </pre></div>
michael@0 209 </div>
michael@0 210 <p>If you need an attribute setting on your mock, just do it:</p>
michael@0 211 <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>
michael@0 212 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">3</span>
michael@0 213 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">x</span>
michael@0 214 <span class="go">3</span>
michael@0 215 </pre></div>
michael@0 216 </div>
michael@0 217 <p>Sometimes you want to mock up a more complex situation, like for example
michael@0 218 <cite>mock.connection.cursor().execute(&#8220;SELECT 1&#8221;)</cite>. If we wanted this call to
michael@0 219 return a list, then we have to configure the result of the nested call.</p>
michael@0 220 <p>We can use <tt class="xref py py-data docutils literal"><span class="pre">call</span></tt> to construct the set of calls in a &#8220;chained call&#8221; like
michael@0 221 this for easy assertion afterwards:</p>
michael@0 222 <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>
michael@0 223 <span class="gp">&gt;&gt;&gt; </span><span class="n">cursor</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">return_value</span>
michael@0 224 <span class="gp">&gt;&gt;&gt; </span><span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;foo&#39;</span><span class="p">]</span>
michael@0 225 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s">&quot;SELECT 1&quot;</span><span class="p">)</span>
michael@0 226 <span class="go">[&#39;foo&#39;]</span>
michael@0 227 <span class="gp">&gt;&gt;&gt; </span><span class="n">expected</span> <span class="o">=</span> <span class="n">call</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s">&quot;SELECT 1&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">call_list</span><span class="p">()</span>
michael@0 228 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">mock_calls</span>
michael@0 229 <span class="go">[call.connection.cursor(), call.connection.cursor().execute(&#39;SELECT 1&#39;)]</span>
michael@0 230 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">mock_calls</span> <span class="o">==</span> <span class="n">expected</span>
michael@0 231 <span class="go">True</span>
michael@0 232 </pre></div>
michael@0 233 </div>
michael@0 234 <p>It is the call to <cite>.call_list()</cite> that turns our call object into a list of
michael@0 235 calls representing the chained calls.</p>
michael@0 236 </div>
michael@0 237 <div class="section" id="raising-exceptions-with-mocks">
michael@0 238 <h3>Raising exceptions with mocks<a class="headerlink" href="#raising-exceptions-with-mocks" title="Permalink to this headline">¶</a></h3>
michael@0 239 <p>A useful attribute is <tt class="xref py py-attr docutils literal"><span class="pre">side_effect</span></tt>. If you set this to an
michael@0 240 exception class or instance then the exception will be raised when the mock
michael@0 241 is called.</p>
michael@0 242 <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><span class="n">side_effect</span><span class="o">=</span><span class="ne">Exception</span><span class="p">(</span><span class="s">&#39;Boom!&#39;</span><span class="p">))</span>
michael@0 243 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="p">()</span>
michael@0 244 <span class="gt">Traceback (most recent call last):</span>
michael@0 245 <span class="c">...</span>
michael@0 246 <span class="gr">Exception</span>: <span class="n">Boom!</span>
michael@0 247 </pre></div>
michael@0 248 </div>
michael@0 249 </div>
michael@0 250 <div class="section" id="side-effect-functions-and-iterables">
michael@0 251 <h3>Side effect functions and iterables<a class="headerlink" href="#side-effect-functions-and-iterables" title="Permalink to this headline">¶</a></h3>
michael@0 252 <p><cite>side_effect</cite> can also be set to a function or an iterable. The use case for
michael@0 253 <cite>side_effect</cite> as an iterable is where your mock is going to be called several
michael@0 254 times, and you want each call to return a different value. When you set
michael@0 255 <cite>side_effect</cite> to an iterable every call to the mock returns the next value
michael@0 256 from the iterable:</p>
michael@0 257 <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><span class="n">side_effect</span><span class="o">=</span><span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">])</span>
michael@0 258 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="p">()</span>
michael@0 259 <span class="go">4</span>
michael@0 260 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="p">()</span>
michael@0 261 <span class="go">5</span>
michael@0 262 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="p">()</span>
michael@0 263 <span class="go">6</span>
michael@0 264 </pre></div>
michael@0 265 </div>
michael@0 266 <p>For more advanced use cases, like dynamically varying the return values
michael@0 267 depending on what the mock is called with, <cite>side_effect</cite> can be a function.
michael@0 268 The function will be called with the same arguments as the mock. Whatever the
michael@0 269 function returns is what the call returns:</p>
michael@0 270 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">vals</span> <span class="o">=</span> <span class="p">{(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span> <span class="mi">2</span><span class="p">}</span>
michael@0 271 <span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">side_effect</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
michael@0 272 <span class="gp">... </span> <span class="k">return</span> <span class="n">vals</span><span class="p">[</span><span class="n">args</span><span class="p">]</span>
michael@0 273 <span class="gp">...</span>
michael@0 274 <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><span class="n">side_effect</span><span class="o">=</span><span class="n">side_effect</span><span class="p">)</span>
michael@0 275 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
michael@0 276 <span class="go">1</span>
michael@0 277 <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> <span class="mi">3</span><span class="p">)</span>
michael@0 278 <span class="go">2</span>
michael@0 279 </pre></div>
michael@0 280 </div>
michael@0 281 </div>
michael@0 282 <div class="section" id="creating-a-mock-from-an-existing-object">
michael@0 283 <h3>Creating a Mock from an Existing Object<a class="headerlink" href="#creating-a-mock-from-an-existing-object" title="Permalink to this headline">¶</a></h3>
michael@0 284 <p>One problem with over use of mocking is that it couples your tests to the
michael@0 285 implementation of your mocks rather than your real code. Suppose you have a
michael@0 286 class that implements <cite>some_method</cite>. In a test for another class, you
michael@0 287 provide a mock of this object that <em>also</em> provides <cite>some_method</cite>. If later
michael@0 288 you refactor the first class, so that it no longer has <cite>some_method</cite> - then
michael@0 289 your tests will continue to pass even though your code is now broken!</p>
michael@0 290 <p><cite>Mock</cite> allows you to provide an object as a specification for the mock,
michael@0 291 using the <cite>spec</cite> keyword argument. Accessing methods / attributes on the
michael@0 292 mock that don&#8217;t exist on your specification object will immediately raise an
michael@0 293 attribute error. If you change the implementation of your specification, then
michael@0 294 tests that use that class will start failing immediately without you having to
michael@0 295 instantiate the class in those tests.</p>
michael@0 296 <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><span class="n">spec</span><span class="o">=</span><span class="n">SomeClass</span><span class="p">)</span>
michael@0 297 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">old_method</span><span class="p">()</span>
michael@0 298 <span class="gt">Traceback (most recent call last):</span>
michael@0 299 <span class="c">...</span>
michael@0 300 <span class="gr">AttributeError</span>: <span class="n">object has no attribute &#39;old_method&#39;</span>
michael@0 301 </pre></div>
michael@0 302 </div>
michael@0 303 <p>If you want a stronger form of specification that prevents the setting
michael@0 304 of arbitrary attributes as well as the getting of them then you can use
michael@0 305 <cite>spec_set</cite> instead of <cite>spec</cite>.</p>
michael@0 306 </div>
michael@0 307 </div>
michael@0 308 <div class="section" id="patch-decorators">
michael@0 309 <h2>Patch Decorators<a class="headerlink" href="#patch-decorators" title="Permalink to this headline">¶</a></h2>
michael@0 310 <div class="admonition note">
michael@0 311 <p class="first admonition-title">Note</p>
michael@0 312 <p class="last">With <cite>patch</cite> it matters that you patch objects in the namespace where they
michael@0 313 are looked up. This is normally straightforward, but for a quick guide
michael@0 314 read <a class="reference internal" href="patch.html#where-to-patch"><em>where to patch</em></a>.</p>
michael@0 315 </div>
michael@0 316 <p>A common need in tests is to patch a class attribute or a module attribute,
michael@0 317 for example patching a builtin or patching a class in a module to test that it
michael@0 318 is instantiated. Modules and classes are effectively global, so patching on
michael@0 319 them has to be undone after the test or the patch will persist into other
michael@0 320 tests and cause hard to diagnose problems.</p>
michael@0 321 <p>mock provides three convenient decorators for this: <cite>patch</cite>, <cite>patch.object</cite> and
michael@0 322 <cite>patch.dict</cite>. <cite>patch</cite> takes a single string, of the form
michael@0 323 <cite>package.module.Class.attribute</cite> to specify the attribute you are patching. It
michael@0 324 also optionally takes a value that you want the attribute (or class or
michael@0 325 whatever) to be replaced with. &#8216;patch.object&#8217; takes an object and the name of
michael@0 326 the attribute you would like patched, plus optionally the value to patch it
michael@0 327 with.</p>
michael@0 328 <p><cite>patch.object</cite>:</p>
michael@0 329 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">original</span> <span class="o">=</span> <span class="n">SomeClass</span><span class="o">.</span><span class="n">attribute</span>
michael@0 330 <span class="gp">&gt;&gt;&gt; </span><span class="nd">@patch.object</span><span class="p">(</span><span class="n">SomeClass</span><span class="p">,</span> <span class="s">&#39;attribute&#39;</span><span class="p">,</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span><span class="p">)</span>
michael@0 331 <span class="gp">... </span><span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
michael@0 332 <span class="gp">... </span> <span class="k">assert</span> <span class="n">SomeClass</span><span class="o">.</span><span class="n">attribute</span> <span class="o">==</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span>
michael@0 333 <span class="gp">...</span>
michael@0 334 <span class="gp">&gt;&gt;&gt; </span><span class="n">test</span><span class="p">()</span>
michael@0 335 <span class="gp">&gt;&gt;&gt; </span><span class="k">assert</span> <span class="n">SomeClass</span><span class="o">.</span><span class="n">attribute</span> <span class="o">==</span> <span class="n">original</span>
michael@0 336
michael@0 337 <span class="gp">&gt;&gt;&gt; </span><span class="nd">@patch</span><span class="p">(</span><span class="s">&#39;package.module.attribute&#39;</span><span class="p">,</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span><span class="p">)</span>
michael@0 338 <span class="gp">... </span><span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
michael@0 339 <span class="gp">... </span> <span class="kn">from</span> <span class="nn">package.module</span> <span class="kn">import</span> <span class="n">attribute</span>
michael@0 340 <span class="gp">... </span> <span class="k">assert</span> <span class="n">attribute</span> <span class="ow">is</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span>
michael@0 341 <span class="gp">...</span>
michael@0 342 <span class="gp">&gt;&gt;&gt; </span><span class="n">test</span><span class="p">()</span>
michael@0 343 </pre></div>
michael@0 344 </div>
michael@0 345 <p>If you are patching a module (including <cite>__builtin__</cite>) then use <cite>patch</cite>
michael@0 346 instead of <cite>patch.object</cite>:</p>
michael@0 347 <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><span class="n">return_value</span> <span class="o">=</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">file_handle</span><span class="p">)</span>
michael@0 348 <span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="n">patch</span><span class="p">(</span><span class="s">&#39;__builtin__.open&#39;</span><span class="p">,</span> <span class="n">mock</span><span class="p">):</span>
michael@0 349 <span class="gp">... </span> <span class="n">handle</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;filename&#39;</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span>
michael@0 350 <span class="gp">...</span>
michael@0 351 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="s">&#39;filename&#39;</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span>
michael@0 352 <span class="gp">&gt;&gt;&gt; </span><span class="k">assert</span> <span class="n">handle</span> <span class="o">==</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">file_handle</span><span class="p">,</span> <span class="s">&quot;incorrect file handle returned&quot;</span>
michael@0 353 </pre></div>
michael@0 354 </div>
michael@0 355 <p>The module name can be &#8216;dotted&#8217;, in the form <cite>package.module</cite> if needed:</p>
michael@0 356 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="nd">@patch</span><span class="p">(</span><span class="s">&#39;package.module.ClassName.attribute&#39;</span><span class="p">,</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span><span class="p">)</span>
michael@0 357 <span class="gp">... </span><span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
michael@0 358 <span class="gp">... </span> <span class="kn">from</span> <span class="nn">package.module</span> <span class="kn">import</span> <span class="n">ClassName</span>
michael@0 359 <span class="gp">... </span> <span class="k">assert</span> <span class="n">ClassName</span><span class="o">.</span><span class="n">attribute</span> <span class="o">==</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span>
michael@0 360 <span class="gp">...</span>
michael@0 361 <span class="gp">&gt;&gt;&gt; </span><span class="n">test</span><span class="p">()</span>
michael@0 362 </pre></div>
michael@0 363 </div>
michael@0 364 <p>A nice pattern is to actually decorate test methods themselves:</p>
michael@0 365 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">MyTest</span><span class="p">(</span><span class="n">unittest2</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
michael@0 366 <span class="gp">... </span> <span class="nd">@patch.object</span><span class="p">(</span><span class="n">SomeClass</span><span class="p">,</span> <span class="s">&#39;attribute&#39;</span><span class="p">,</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span><span class="p">)</span>
michael@0 367 <span class="gp">... </span> <span class="k">def</span> <span class="nf">test_something</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
michael@0 368 <span class="gp">... </span> <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">SomeClass</span><span class="o">.</span><span class="n">attribute</span><span class="p">,</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span><span class="p">)</span>
michael@0 369 <span class="gp">...</span>
michael@0 370 <span class="gp">&gt;&gt;&gt; </span><span class="n">original</span> <span class="o">=</span> <span class="n">SomeClass</span><span class="o">.</span><span class="n">attribute</span>
michael@0 371 <span class="gp">&gt;&gt;&gt; </span><span class="n">MyTest</span><span class="p">(</span><span class="s">&#39;test_something&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">test_something</span><span class="p">()</span>
michael@0 372 <span class="gp">&gt;&gt;&gt; </span><span class="k">assert</span> <span class="n">SomeClass</span><span class="o">.</span><span class="n">attribute</span> <span class="o">==</span> <span class="n">original</span>
michael@0 373 </pre></div>
michael@0 374 </div>
michael@0 375 <p>If you want to patch with a Mock, you can use <cite>patch</cite> with only one argument
michael@0 376 (or <cite>patch.object</cite> with two arguments). The mock will be created for you and
michael@0 377 passed into the test function / method:</p>
michael@0 378 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">MyTest</span><span class="p">(</span><span class="n">unittest2</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
michael@0 379 <span class="gp">... </span> <span class="nd">@patch.object</span><span class="p">(</span><span class="n">SomeClass</span><span class="p">,</span> <span class="s">&#39;static_method&#39;</span><span class="p">)</span>
michael@0 380 <span class="gp">... </span> <span class="k">def</span> <span class="nf">test_something</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mock_method</span><span class="p">):</span>
michael@0 381 <span class="gp">... </span> <span class="n">SomeClass</span><span class="o">.</span><span class="n">static_method</span><span class="p">()</span>
michael@0 382 <span class="gp">... </span> <span class="n">mock_method</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">()</span>
michael@0 383 <span class="gp">...</span>
michael@0 384 <span class="gp">&gt;&gt;&gt; </span><span class="n">MyTest</span><span class="p">(</span><span class="s">&#39;test_something&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">test_something</span><span class="p">()</span>
michael@0 385 </pre></div>
michael@0 386 </div>
michael@0 387 <p>You can stack up multiple patch decorators using this pattern:</p>
michael@0 388 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">MyTest</span><span class="p">(</span><span class="n">unittest2</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
michael@0 389 <span class="gp">... </span> <span class="nd">@patch</span><span class="p">(</span><span class="s">&#39;package.module.ClassName1&#39;</span><span class="p">)</span>
michael@0 390 <span class="gp">... </span> <span class="nd">@patch</span><span class="p">(</span><span class="s">&#39;package.module.ClassName2&#39;</span><span class="p">)</span>
michael@0 391 <span class="gp">... </span> <span class="k">def</span> <span class="nf">test_something</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">MockClass2</span><span class="p">,</span> <span class="n">MockClass1</span><span class="p">):</span>
michael@0 392 <span class="gp">... </span> <span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">package</span><span class="o">.</span><span class="n">module</span><span class="o">.</span><span class="n">ClassName1</span> <span class="ow">is</span> <span class="n">MockClass1</span><span class="p">)</span>
michael@0 393 <span class="gp">... </span> <span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">package</span><span class="o">.</span><span class="n">module</span><span class="o">.</span><span class="n">ClassName2</span> <span class="ow">is</span> <span class="n">MockClass2</span><span class="p">)</span>
michael@0 394 <span class="gp">...</span>
michael@0 395 <span class="gp">&gt;&gt;&gt; </span><span class="n">MyTest</span><span class="p">(</span><span class="s">&#39;test_something&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">test_something</span><span class="p">()</span>
michael@0 396 </pre></div>
michael@0 397 </div>
michael@0 398 <p>When you nest patch decorators the mocks are passed in to the decorated
michael@0 399 function in the same order they applied (the normal <em>python</em> order that
michael@0 400 decorators are applied). This means from the bottom up, so in the example
michael@0 401 above the mock for <cite>test_module.ClassName2</cite> is passed in first.</p>
michael@0 402 <p>There is also <tt class="xref py py-func docutils literal"><span class="pre">patch.dict()</span></tt> for setting values in a dictionary just
michael@0 403 during a scope and restoring the dictionary to its original state when the test
michael@0 404 ends:</p>
michael@0 405 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">foo</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;key&#39;</span><span class="p">:</span> <span class="s">&#39;value&#39;</span><span class="p">}</span>
michael@0 406 <span class="gp">&gt;&gt;&gt; </span><span class="n">original</span> <span class="o">=</span> <span class="n">foo</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
michael@0 407 <span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="n">patch</span><span class="o">.</span><span class="n">dict</span><span class="p">(</span><span class="n">foo</span><span class="p">,</span> <span class="p">{</span><span class="s">&#39;newkey&#39;</span><span class="p">:</span> <span class="s">&#39;newvalue&#39;</span><span class="p">},</span> <span class="n">clear</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
michael@0 408 <span class="gp">... </span> <span class="k">assert</span> <span class="n">foo</span> <span class="o">==</span> <span class="p">{</span><span class="s">&#39;newkey&#39;</span><span class="p">:</span> <span class="s">&#39;newvalue&#39;</span><span class="p">}</span>
michael@0 409 <span class="gp">...</span>
michael@0 410 <span class="gp">&gt;&gt;&gt; </span><span class="k">assert</span> <span class="n">foo</span> <span class="o">==</span> <span class="n">original</span>
michael@0 411 </pre></div>
michael@0 412 </div>
michael@0 413 <p><cite>patch</cite>, <cite>patch.object</cite> and <cite>patch.dict</cite> can all be used as context managers.</p>
michael@0 414 <p>Where you use <cite>patch</cite> to create a mock for you, you can get a reference to the
michael@0 415 mock using the &#8220;as&#8221; form of the with statement:</p>
michael@0 416 <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">ProductionClass</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
michael@0 417 <span class="gp">... </span> <span class="k">def</span> <span class="nf">method</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
michael@0 418 <span class="gp">... </span> <span class="k">pass</span>
michael@0 419 <span class="gp">...</span>
michael@0 420 <span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="n">patch</span><span class="o">.</span><span class="n">object</span><span class="p">(</span><span class="n">ProductionClass</span><span class="p">,</span> <span class="s">&#39;method&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_method</span><span class="p">:</span>
michael@0 421 <span class="gp">... </span> <span class="n">mock_method</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="bp">None</span>
michael@0 422 <span class="gp">... </span> <span class="n">real</span> <span class="o">=</span> <span class="n">ProductionClass</span><span class="p">()</span>
michael@0 423 <span class="gp">... </span> <span class="n">real</span><span class="o">.</span><span class="n">method</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
michael@0 424 <span class="gp">...</span>
michael@0 425 <span class="gp">&gt;&gt;&gt; </span><span class="n">mock_method</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
michael@0 426 </pre></div>
michael@0 427 </div>
michael@0 428 <p>As an alternative <cite>patch</cite>, <cite>patch.object</cite> and <cite>patch.dict</cite> can be used as
michael@0 429 class decorators. When used in this way it is the same as applying the
michael@0 430 decorator indvidually to every method whose name starts with &#8220;test&#8221;.</p>
michael@0 431 <p>For some more advanced examples, see the <a class="reference internal" href="examples.html#further-examples"><em>Further Examples</em></a> page.</p>
michael@0 432 </div>
michael@0 433 </div>
michael@0 434
michael@0 435
michael@0 436 </div>
michael@0 437 </div>
michael@0 438 </div>
michael@0 439 <div class="sphinxsidebar">
michael@0 440 <div class="sphinxsidebarwrapper">
michael@0 441 <h3><a href="index.html">Table Of Contents</a></h3>
michael@0 442 <ul>
michael@0 443 <li><a class="reference internal" href="#">Getting Started with Mock</a><ul>
michael@0 444 <li><a class="reference internal" href="#using-mock">Using Mock</a><ul>
michael@0 445 <li><a class="reference internal" href="#mock-patching-methods">Mock Patching Methods</a></li>
michael@0 446 <li><a class="reference internal" href="#mock-for-method-calls-on-an-object">Mock for Method Calls on an Object</a></li>
michael@0 447 <li><a class="reference internal" href="#mocking-classes">Mocking Classes</a></li>
michael@0 448 <li><a class="reference internal" href="#naming-your-mocks">Naming your mocks</a></li>
michael@0 449 <li><a class="reference internal" href="#tracking-all-calls">Tracking all Calls</a></li>
michael@0 450 <li><a class="reference internal" href="#setting-return-values-and-attributes">Setting Return Values and Attributes</a></li>
michael@0 451 <li><a class="reference internal" href="#raising-exceptions-with-mocks">Raising exceptions with mocks</a></li>
michael@0 452 <li><a class="reference internal" href="#side-effect-functions-and-iterables">Side effect functions and iterables</a></li>
michael@0 453 <li><a class="reference internal" href="#creating-a-mock-from-an-existing-object">Creating a Mock from an Existing Object</a></li>
michael@0 454 </ul>
michael@0 455 </li>
michael@0 456 <li><a class="reference internal" href="#patch-decorators">Patch Decorators</a></li>
michael@0 457 </ul>
michael@0 458 </li>
michael@0 459 </ul>
michael@0 460
michael@0 461 <h4>Previous topic</h4>
michael@0 462 <p class="topless"><a href="magicmock.html"
michael@0 463 title="previous chapter">Mocking Magic Methods</a></p>
michael@0 464 <h4>Next topic</h4>
michael@0 465 <p class="topless"><a href="examples.html"
michael@0 466 title="next chapter">Further Examples</a></p>
michael@0 467 <h3>This Page</h3>
michael@0 468 <ul class="this-page-menu">
michael@0 469 <li><a href="_sources/getting-started.txt"
michael@0 470 rel="nofollow">Show Source</a></li>
michael@0 471 </ul>
michael@0 472 <div id="searchbox" style="display: none">
michael@0 473 <h3>Quick search</h3>
michael@0 474 <form class="search" action="search.html" method="get">
michael@0 475 <input type="text" name="q" />
michael@0 476 <input type="submit" value="Go" />
michael@0 477 <input type="hidden" name="check_keywords" value="yes" />
michael@0 478 <input type="hidden" name="area" value="default" />
michael@0 479 </form>
michael@0 480 <p class="searchtip" style="font-size: 90%">
michael@0 481 Enter search terms or a module, class or function name.
michael@0 482 </p>
michael@0 483 </div>
michael@0 484 <script type="text/javascript">$('#searchbox').show(0);</script>
michael@0 485 </div>
michael@0 486 </div>
michael@0 487 <div class="clearer"></div>
michael@0 488 </div>
michael@0 489 <div class="related">
michael@0 490 <h3>Navigation</h3>
michael@0 491 <ul>
michael@0 492 <li class="right" style="margin-right: 10px">
michael@0 493 <a href="genindex.html" title="General Index"
michael@0 494 >index</a></li>
michael@0 495 <li class="right" >
michael@0 496 <a href="examples.html" title="Further Examples"
michael@0 497 >next</a> |</li>
michael@0 498 <li class="right" >
michael@0 499 <a href="magicmock.html" title="Mocking Magic Methods"
michael@0 500 >previous</a> |</li>
michael@0 501 <li><a href="index.html">Mock 1.0.0 documentation</a> &raquo;</li>
michael@0 502 </ul>
michael@0 503 </div>
michael@0 504 <div class="footer">
michael@0 505 &copy; Copyright 2007-2012, Michael Foord &amp; the mock team.
michael@0 506 Last updated on Oct 07, 2012.
michael@0 507 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
michael@0 508 </div>
michael@0 509 </body>
michael@0 510 </html>

mercurial