1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/python/mock-1.0.0/html/getting-started.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,510 @@ 1.4 + 1.5 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 1.6 + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 1.7 + 1.8 + 1.9 +<html xmlns="http://www.w3.org/1999/xhtml"> 1.10 + <head> 1.11 + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 1.12 + 1.13 + <title>Getting Started with Mock — Mock 1.0.0 documentation</title> 1.14 + 1.15 + <link rel="stylesheet" href="_static/nature.css" type="text/css" /> 1.16 + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> 1.17 + 1.18 + <script type="text/javascript"> 1.19 + var DOCUMENTATION_OPTIONS = { 1.20 + URL_ROOT: '', 1.21 + VERSION: '1.0.0', 1.22 + COLLAPSE_INDEX: false, 1.23 + FILE_SUFFIX: '.html', 1.24 + HAS_SOURCE: true 1.25 + }; 1.26 + </script> 1.27 + <script type="text/javascript" src="_static/jquery.js"></script> 1.28 + <script type="text/javascript" src="_static/underscore.js"></script> 1.29 + <script type="text/javascript" src="_static/doctools.js"></script> 1.30 + <link rel="top" title="Mock 1.0.0 documentation" href="index.html" /> 1.31 + <link rel="next" title="Further Examples" href="examples.html" /> 1.32 + <link rel="prev" title="Mocking Magic Methods" href="magicmock.html" /> 1.33 + </head> 1.34 + <body> 1.35 + <div class="related"> 1.36 + <h3>Navigation</h3> 1.37 + <ul> 1.38 + <li class="right" style="margin-right: 10px"> 1.39 + <a href="genindex.html" title="General Index" 1.40 + accesskey="I">index</a></li> 1.41 + <li class="right" > 1.42 + <a href="examples.html" title="Further Examples" 1.43 + accesskey="N">next</a> |</li> 1.44 + <li class="right" > 1.45 + <a href="magicmock.html" title="Mocking Magic Methods" 1.46 + accesskey="P">previous</a> |</li> 1.47 + <li><a href="index.html">Mock 1.0.0 documentation</a> »</li> 1.48 + </ul> 1.49 + </div> 1.50 + 1.51 + <div class="document"> 1.52 + <div class="documentwrapper"> 1.53 + <div class="bodywrapper"> 1.54 + <div class="body"> 1.55 + 1.56 + <div class="section" id="getting-started-with-mock"> 1.57 +<h1>Getting Started with Mock<a class="headerlink" href="#getting-started-with-mock" title="Permalink to this headline">¶</a></h1> 1.58 +<span class="target" id="getting-started"></span><span class="target" id="index-0"></span><div class="section" id="using-mock"> 1.59 +<h2>Using Mock<a class="headerlink" href="#using-mock" title="Permalink to this headline">¶</a></h2> 1.60 +<div class="section" id="mock-patching-methods"> 1.61 +<h3>Mock Patching Methods<a class="headerlink" href="#mock-patching-methods" title="Permalink to this headline">¶</a></h3> 1.62 +<p>Common uses for <tt class="xref py py-class docutils literal"><span class="pre">Mock</span></tt> objects include:</p> 1.63 +<ul class="simple"> 1.64 +<li>Patching methods</li> 1.65 +<li>Recording method calls on objects</li> 1.66 +</ul> 1.67 +<p>You might want to replace a method on an object to check that 1.68 +it is called with the correct arguments by another part of the system:</p> 1.69 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">real</span> <span class="o">=</span> <span class="n">SomeClass</span><span class="p">()</span> 1.70 +<span class="gp">>>> </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">'method'</span><span class="p">)</span> 1.71 +<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">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">'value'</span><span class="p">)</span> 1.72 +<span class="go"><MagicMock name='method()' id='...'></span> 1.73 +</pre></div> 1.74 +</div> 1.75 +<p>Once our mock has been used (<cite>real.method</cite> in this example) it has methods 1.76 +and attributes that allow you to make assertions about how it has been used.</p> 1.77 +<div class="admonition note"> 1.78 +<p class="first admonition-title">Note</p> 1.79 +<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 1.80 +are interchangeable. As the <cite>MagicMock</cite> is the more capable class it makes 1.81 +a sensible one to use by default.</p> 1.82 +</div> 1.83 +<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 1.84 +<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 1.85 +<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 1.86 +the correct arguments.</p> 1.87 +<p>This example tests that calling <cite>ProductionClass().method</cite> results in a call to 1.88 +the <cite>something</cite> method:</p> 1.89 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">mock</span> <span class="kn">import</span> <span class="n">MagicMock</span> 1.90 +<span class="gp">>>> </span><span class="k">class</span> <span class="nc">ProductionClass</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> 1.91 +<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> 1.92 +<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> 1.93 +<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> 1.94 +<span class="gp">... </span> <span class="k">pass</span> 1.95 +<span class="gp">...</span> 1.96 +<span class="gp">>>> </span><span class="n">real</span> <span class="o">=</span> <span class="n">ProductionClass</span><span class="p">()</span> 1.97 +<span class="gp">>>> </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> 1.98 +<span class="gp">>>> </span><span class="n">real</span><span class="o">.</span><span class="n">method</span><span class="p">()</span> 1.99 +<span class="gp">>>> </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> 1.100 +</pre></div> 1.101 +</div> 1.102 +</div> 1.103 +<div class="section" id="mock-for-method-calls-on-an-object"> 1.104 +<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> 1.105 +<p>In the last example we patched a method directly on an object to check that it 1.106 +was called correctly. Another common use case is to pass an object into a 1.107 +method (or some part of the system under test) and then check that it is used 1.108 +in the correct way.</p> 1.109 +<p>The simple <cite>ProductionClass</cite> below has a <cite>closer</cite> method. If it is called with 1.110 +an object then it calls <cite>close</cite> on it.</p> 1.111 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="k">class</span> <span class="nc">ProductionClass</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> 1.112 +<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> 1.113 +<span class="gp">... </span> <span class="n">something</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> 1.114 +<span class="gp">...</span> 1.115 +</pre></div> 1.116 +</div> 1.117 +<p>So to test it we need to pass in an object with a <cite>close</cite> method and check 1.118 +that it was called correctly.</p> 1.119 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">real</span> <span class="o">=</span> <span class="n">ProductionClass</span><span class="p">()</span> 1.120 +<span class="gp">>>> </span><span class="n">mock</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span> 1.121 +<span class="gp">>>> </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> 1.122 +<span class="gp">>>> </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> 1.123 +</pre></div> 1.124 +</div> 1.125 +<p>We don’t have to do any work to provide the ‘close’ method on our mock. 1.126 +Accessing close creates it. So, if ‘close’ hasn’t already been called then 1.127 +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> 1.128 +will raise a failure exception.</p> 1.129 +</div> 1.130 +<div class="section" id="mocking-classes"> 1.131 +<h3>Mocking Classes<a class="headerlink" href="#mocking-classes" title="Permalink to this headline">¶</a></h3> 1.132 +<p>A common use case is to mock out classes instantiated by your code under test. 1.133 +When you patch a class, then that class is replaced with a mock. Instances 1.134 +are created by <em>calling the class</em>. This means you access the “mock instance” 1.135 +by looking at the return value of the mocked class.</p> 1.136 +<p>In the example below we have a function <cite>some_function</cite> that instantiates <cite>Foo</cite> 1.137 +and calls a method on it. The call to <cite>patch</cite> replaces the class <cite>Foo</cite> with a 1.138 +mock. The <cite>Foo</cite> instance is the result of calling the mock, so it is configured 1.139 +by modifying the mock <tt class="xref py py-attr docutils literal"><span class="pre">return_value</span></tt>.</p> 1.140 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="k">def</span> <span class="nf">some_function</span><span class="p">():</span> 1.141 +<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> 1.142 +<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> 1.143 +<span class="gp">...</span> 1.144 +<span class="gp">>>> </span><span class="k">with</span> <span class="n">patch</span><span class="p">(</span><span class="s">'module.Foo'</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock</span><span class="p">:</span> 1.145 +<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> 1.146 +<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">'the result'</span> 1.147 +<span class="gp">... </span> <span class="n">result</span> <span class="o">=</span> <span class="n">some_function</span><span class="p">()</span> 1.148 +<span class="gp">... </span> <span class="k">assert</span> <span class="n">result</span> <span class="o">==</span> <span class="s">'the result'</span> 1.149 +</pre></div> 1.150 +</div> 1.151 +</div> 1.152 +<div class="section" id="naming-your-mocks"> 1.153 +<h3>Naming your mocks<a class="headerlink" href="#naming-your-mocks" title="Permalink to this headline">¶</a></h3> 1.154 +<p>It can be useful to give your mocks a name. The name is shown in the repr of 1.155 +the mock and can be helpful when the mock appears in test failure messages. The 1.156 +name is also propagated to attributes or methods of the mock:</p> 1.157 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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">'foo'</span><span class="p">)</span> 1.158 +<span class="gp">>>> </span><span class="n">mock</span> 1.159 +<span class="go"><MagicMock name='foo' id='...'></span> 1.160 +<span class="gp">>>> </span><span class="n">mock</span><span class="o">.</span><span class="n">method</span> 1.161 +<span class="go"><MagicMock name='foo.method' id='...'></span> 1.162 +</pre></div> 1.163 +</div> 1.164 +</div> 1.165 +<div class="section" id="tracking-all-calls"> 1.166 +<h3>Tracking all Calls<a class="headerlink" href="#tracking-all-calls" title="Permalink to this headline">¶</a></h3> 1.167 +<p>Often you want to track more than a single call to a method. The 1.168 +<tt class="xref py py-attr docutils literal"><span class="pre">mock_calls</span></tt> attribute records all calls 1.169 +to child attributes of the mock - and also to their children.</p> 1.170 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">mock</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">()</span> 1.171 +<span class="gp">>>> </span><span class="n">mock</span><span class="o">.</span><span class="n">method</span><span class="p">()</span> 1.172 +<span class="go"><MagicMock name='mock.method()' id='...'></span> 1.173 +<span class="gp">>>> </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> 1.174 +<span class="go"><MagicMock name='mock.attribute.method()' id='...'></span> 1.175 +<span class="gp">>>> </span><span class="n">mock</span><span class="o">.</span><span class="n">mock_calls</span> 1.176 +<span class="go">[call.method(), call.attribute.method(10, x=53)]</span> 1.177 +</pre></div> 1.178 +</div> 1.179 +<p>If you make an assertion about <cite>mock_calls</cite> and any unexpected methods 1.180 +have been called, then the assertion will fail. This is useful because as well 1.181 +as asserting that the calls you expected have been made, you are also checking 1.182 +that they were made in the right order and with no additional calls:</p> 1.183 +<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 1.184 +<cite>mock_calls</cite>:</p> 1.185 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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> 1.186 +<span class="gp">>>> </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> 1.187 +<span class="go">True</span> 1.188 +</pre></div> 1.189 +</div> 1.190 +</div> 1.191 +<div class="section" id="setting-return-values-and-attributes"> 1.192 +<h3>Setting Return Values and Attributes<a class="headerlink" href="#setting-return-values-and-attributes" title="Permalink to this headline">¶</a></h3> 1.193 +<p>Setting the return values on a mock object is trivially easy:</p> 1.194 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">mock</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span> 1.195 +<span class="gp">>>> </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> 1.196 +<span class="gp">>>> </span><span class="n">mock</span><span class="p">()</span> 1.197 +<span class="go">3</span> 1.198 +</pre></div> 1.199 +</div> 1.200 +<p>Of course you can do the same for methods on the mock:</p> 1.201 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">mock</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span> 1.202 +<span class="gp">>>> </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> 1.203 +<span class="gp">>>> </span><span class="n">mock</span><span class="o">.</span><span class="n">method</span><span class="p">()</span> 1.204 +<span class="go">3</span> 1.205 +</pre></div> 1.206 +</div> 1.207 +<p>The return value can also be set in the constructor:</p> 1.208 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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> 1.209 +<span class="gp">>>> </span><span class="n">mock</span><span class="p">()</span> 1.210 +<span class="go">3</span> 1.211 +</pre></div> 1.212 +</div> 1.213 +<p>If you need an attribute setting on your mock, just do it:</p> 1.214 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">mock</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span> 1.215 +<span class="gp">>>> </span><span class="n">mock</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">3</span> 1.216 +<span class="gp">>>> </span><span class="n">mock</span><span class="o">.</span><span class="n">x</span> 1.217 +<span class="go">3</span> 1.218 +</pre></div> 1.219 +</div> 1.220 +<p>Sometimes you want to mock up a more complex situation, like for example 1.221 +<cite>mock.connection.cursor().execute(“SELECT 1”)</cite>. If we wanted this call to 1.222 +return a list, then we have to configure the result of the nested call.</p> 1.223 +<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 “chained call” like 1.224 +this for easy assertion afterwards:</p> 1.225 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">mock</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span> 1.226 +<span class="gp">>>> </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> 1.227 +<span class="gp">>>> </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">'foo'</span><span class="p">]</span> 1.228 +<span class="gp">>>> </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">"SELECT 1"</span><span class="p">)</span> 1.229 +<span class="go">['foo']</span> 1.230 +<span class="gp">>>> </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">"SELECT 1"</span><span class="p">)</span><span class="o">.</span><span class="n">call_list</span><span class="p">()</span> 1.231 +<span class="gp">>>> </span><span class="n">mock</span><span class="o">.</span><span class="n">mock_calls</span> 1.232 +<span class="go">[call.connection.cursor(), call.connection.cursor().execute('SELECT 1')]</span> 1.233 +<span class="gp">>>> </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> 1.234 +<span class="go">True</span> 1.235 +</pre></div> 1.236 +</div> 1.237 +<p>It is the call to <cite>.call_list()</cite> that turns our call object into a list of 1.238 +calls representing the chained calls.</p> 1.239 +</div> 1.240 +<div class="section" id="raising-exceptions-with-mocks"> 1.241 +<h3>Raising exceptions with mocks<a class="headerlink" href="#raising-exceptions-with-mocks" title="Permalink to this headline">¶</a></h3> 1.242 +<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 1.243 +exception class or instance then the exception will be raised when the mock 1.244 +is called.</p> 1.245 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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">'Boom!'</span><span class="p">))</span> 1.246 +<span class="gp">>>> </span><span class="n">mock</span><span class="p">()</span> 1.247 +<span class="gt">Traceback (most recent call last):</span> 1.248 + <span class="c">...</span> 1.249 +<span class="gr">Exception</span>: <span class="n">Boom!</span> 1.250 +</pre></div> 1.251 +</div> 1.252 +</div> 1.253 +<div class="section" id="side-effect-functions-and-iterables"> 1.254 +<h3>Side effect functions and iterables<a class="headerlink" href="#side-effect-functions-and-iterables" title="Permalink to this headline">¶</a></h3> 1.255 +<p><cite>side_effect</cite> can also be set to a function or an iterable. The use case for 1.256 +<cite>side_effect</cite> as an iterable is where your mock is going to be called several 1.257 +times, and you want each call to return a different value. When you set 1.258 +<cite>side_effect</cite> to an iterable every call to the mock returns the next value 1.259 +from the iterable:</p> 1.260 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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> 1.261 +<span class="gp">>>> </span><span class="n">mock</span><span class="p">()</span> 1.262 +<span class="go">4</span> 1.263 +<span class="gp">>>> </span><span class="n">mock</span><span class="p">()</span> 1.264 +<span class="go">5</span> 1.265 +<span class="gp">>>> </span><span class="n">mock</span><span class="p">()</span> 1.266 +<span class="go">6</span> 1.267 +</pre></div> 1.268 +</div> 1.269 +<p>For more advanced use cases, like dynamically varying the return values 1.270 +depending on what the mock is called with, <cite>side_effect</cite> can be a function. 1.271 +The function will be called with the same arguments as the mock. Whatever the 1.272 +function returns is what the call returns:</p> 1.273 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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> 1.274 +<span class="gp">>>> </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> 1.275 +<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> 1.276 +<span class="gp">...</span> 1.277 +<span class="gp">>>> </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> 1.278 +<span class="gp">>>> </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> 1.279 +<span class="go">1</span> 1.280 +<span class="gp">>>> </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> 1.281 +<span class="go">2</span> 1.282 +</pre></div> 1.283 +</div> 1.284 +</div> 1.285 +<div class="section" id="creating-a-mock-from-an-existing-object"> 1.286 +<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> 1.287 +<p>One problem with over use of mocking is that it couples your tests to the 1.288 +implementation of your mocks rather than your real code. Suppose you have a 1.289 +class that implements <cite>some_method</cite>. In a test for another class, you 1.290 +provide a mock of this object that <em>also</em> provides <cite>some_method</cite>. If later 1.291 +you refactor the first class, so that it no longer has <cite>some_method</cite> - then 1.292 +your tests will continue to pass even though your code is now broken!</p> 1.293 +<p><cite>Mock</cite> allows you to provide an object as a specification for the mock, 1.294 +using the <cite>spec</cite> keyword argument. Accessing methods / attributes on the 1.295 +mock that don’t exist on your specification object will immediately raise an 1.296 +attribute error. If you change the implementation of your specification, then 1.297 +tests that use that class will start failing immediately without you having to 1.298 +instantiate the class in those tests.</p> 1.299 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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> 1.300 +<span class="gp">>>> </span><span class="n">mock</span><span class="o">.</span><span class="n">old_method</span><span class="p">()</span> 1.301 +<span class="gt">Traceback (most recent call last):</span> 1.302 + <span class="c">...</span> 1.303 +<span class="gr">AttributeError</span>: <span class="n">object has no attribute 'old_method'</span> 1.304 +</pre></div> 1.305 +</div> 1.306 +<p>If you want a stronger form of specification that prevents the setting 1.307 +of arbitrary attributes as well as the getting of them then you can use 1.308 +<cite>spec_set</cite> instead of <cite>spec</cite>.</p> 1.309 +</div> 1.310 +</div> 1.311 +<div class="section" id="patch-decorators"> 1.312 +<h2>Patch Decorators<a class="headerlink" href="#patch-decorators" title="Permalink to this headline">¶</a></h2> 1.313 +<div class="admonition note"> 1.314 +<p class="first admonition-title">Note</p> 1.315 +<p class="last">With <cite>patch</cite> it matters that you patch objects in the namespace where they 1.316 +are looked up. This is normally straightforward, but for a quick guide 1.317 +read <a class="reference internal" href="patch.html#where-to-patch"><em>where to patch</em></a>.</p> 1.318 +</div> 1.319 +<p>A common need in tests is to patch a class attribute or a module attribute, 1.320 +for example patching a builtin or patching a class in a module to test that it 1.321 +is instantiated. Modules and classes are effectively global, so patching on 1.322 +them has to be undone after the test or the patch will persist into other 1.323 +tests and cause hard to diagnose problems.</p> 1.324 +<p>mock provides three convenient decorators for this: <cite>patch</cite>, <cite>patch.object</cite> and 1.325 +<cite>patch.dict</cite>. <cite>patch</cite> takes a single string, of the form 1.326 +<cite>package.module.Class.attribute</cite> to specify the attribute you are patching. It 1.327 +also optionally takes a value that you want the attribute (or class or 1.328 +whatever) to be replaced with. ‘patch.object’ takes an object and the name of 1.329 +the attribute you would like patched, plus optionally the value to patch it 1.330 +with.</p> 1.331 +<p><cite>patch.object</cite>:</p> 1.332 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">original</span> <span class="o">=</span> <span class="n">SomeClass</span><span class="o">.</span><span class="n">attribute</span> 1.333 +<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">'attribute'</span><span class="p">,</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span><span class="p">)</span> 1.334 +<span class="gp">... </span><span class="k">def</span> <span class="nf">test</span><span class="p">():</span> 1.335 +<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> 1.336 +<span class="gp">...</span> 1.337 +<span class="gp">>>> </span><span class="n">test</span><span class="p">()</span> 1.338 +<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">original</span> 1.339 + 1.340 +<span class="gp">>>> </span><span class="nd">@patch</span><span class="p">(</span><span class="s">'package.module.attribute'</span><span class="p">,</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span><span class="p">)</span> 1.341 +<span class="gp">... </span><span class="k">def</span> <span class="nf">test</span><span class="p">():</span> 1.342 +<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> 1.343 +<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> 1.344 +<span class="gp">...</span> 1.345 +<span class="gp">>>> </span><span class="n">test</span><span class="p">()</span> 1.346 +</pre></div> 1.347 +</div> 1.348 +<p>If you are patching a module (including <cite>__builtin__</cite>) then use <cite>patch</cite> 1.349 +instead of <cite>patch.object</cite>:</p> 1.350 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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> 1.351 +<span class="gp">>>> </span><span class="k">with</span> <span class="n">patch</span><span class="p">(</span><span class="s">'__builtin__.open'</span><span class="p">,</span> <span class="n">mock</span><span class="p">):</span> 1.352 +<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">'filename'</span><span class="p">,</span> <span class="s">'r'</span><span class="p">)</span> 1.353 +<span class="gp">...</span> 1.354 +<span class="gp">>>> </span><span class="n">mock</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="s">'filename'</span><span class="p">,</span> <span class="s">'r'</span><span class="p">)</span> 1.355 +<span class="gp">>>> </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">"incorrect file handle returned"</span> 1.356 +</pre></div> 1.357 +</div> 1.358 +<p>The module name can be ‘dotted’, in the form <cite>package.module</cite> if needed:</p> 1.359 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="nd">@patch</span><span class="p">(</span><span class="s">'package.module.ClassName.attribute'</span><span class="p">,</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span><span class="p">)</span> 1.360 +<span class="gp">... </span><span class="k">def</span> <span class="nf">test</span><span class="p">():</span> 1.361 +<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> 1.362 +<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> 1.363 +<span class="gp">...</span> 1.364 +<span class="gp">>>> </span><span class="n">test</span><span class="p">()</span> 1.365 +</pre></div> 1.366 +</div> 1.367 +<p>A nice pattern is to actually decorate test methods themselves:</p> 1.368 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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> 1.369 +<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">'attribute'</span><span class="p">,</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">attribute</span><span class="p">)</span> 1.370 +<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> 1.371 +<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> 1.372 +<span class="gp">...</span> 1.373 +<span class="gp">>>> </span><span class="n">original</span> <span class="o">=</span> <span class="n">SomeClass</span><span class="o">.</span><span class="n">attribute</span> 1.374 +<span class="gp">>>> </span><span class="n">MyTest</span><span class="p">(</span><span class="s">'test_something'</span><span class="p">)</span><span class="o">.</span><span class="n">test_something</span><span class="p">()</span> 1.375 +<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">original</span> 1.376 +</pre></div> 1.377 +</div> 1.378 +<p>If you want to patch with a Mock, you can use <cite>patch</cite> with only one argument 1.379 +(or <cite>patch.object</cite> with two arguments). The mock will be created for you and 1.380 +passed into the test function / method:</p> 1.381 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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> 1.382 +<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">'static_method'</span><span class="p">)</span> 1.383 +<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> 1.384 +<span class="gp">... </span> <span class="n">SomeClass</span><span class="o">.</span><span class="n">static_method</span><span class="p">()</span> 1.385 +<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> 1.386 +<span class="gp">...</span> 1.387 +<span class="gp">>>> </span><span class="n">MyTest</span><span class="p">(</span><span class="s">'test_something'</span><span class="p">)</span><span class="o">.</span><span class="n">test_something</span><span class="p">()</span> 1.388 +</pre></div> 1.389 +</div> 1.390 +<p>You can stack up multiple patch decorators using this pattern:</p> 1.391 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </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> 1.392 +<span class="gp">... </span> <span class="nd">@patch</span><span class="p">(</span><span class="s">'package.module.ClassName1'</span><span class="p">)</span> 1.393 +<span class="gp">... </span> <span class="nd">@patch</span><span class="p">(</span><span class="s">'package.module.ClassName2'</span><span class="p">)</span> 1.394 +<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> 1.395 +<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> 1.396 +<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> 1.397 +<span class="gp">...</span> 1.398 +<span class="gp">>>> </span><span class="n">MyTest</span><span class="p">(</span><span class="s">'test_something'</span><span class="p">)</span><span class="o">.</span><span class="n">test_something</span><span class="p">()</span> 1.399 +</pre></div> 1.400 +</div> 1.401 +<p>When you nest patch decorators the mocks are passed in to the decorated 1.402 +function in the same order they applied (the normal <em>python</em> order that 1.403 +decorators are applied). This means from the bottom up, so in the example 1.404 +above the mock for <cite>test_module.ClassName2</cite> is passed in first.</p> 1.405 +<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 1.406 +during a scope and restoring the dictionary to its original state when the test 1.407 +ends:</p> 1.408 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">foo</span> <span class="o">=</span> <span class="p">{</span><span class="s">'key'</span><span class="p">:</span> <span class="s">'value'</span><span class="p">}</span> 1.409 +<span class="gp">>>> </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> 1.410 +<span class="gp">>>> </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">'newkey'</span><span class="p">:</span> <span class="s">'newvalue'</span><span class="p">},</span> <span class="n">clear</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span> 1.411 +<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">'newkey'</span><span class="p">:</span> <span class="s">'newvalue'</span><span class="p">}</span> 1.412 +<span class="gp">...</span> 1.413 +<span class="gp">>>> </span><span class="k">assert</span> <span class="n">foo</span> <span class="o">==</span> <span class="n">original</span> 1.414 +</pre></div> 1.415 +</div> 1.416 +<p><cite>patch</cite>, <cite>patch.object</cite> and <cite>patch.dict</cite> can all be used as context managers.</p> 1.417 +<p>Where you use <cite>patch</cite> to create a mock for you, you can get a reference to the 1.418 +mock using the “as” form of the with statement:</p> 1.419 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="k">class</span> <span class="nc">ProductionClass</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> 1.420 +<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> 1.421 +<span class="gp">... </span> <span class="k">pass</span> 1.422 +<span class="gp">...</span> 1.423 +<span class="gp">>>> </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">'method'</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_method</span><span class="p">:</span> 1.424 +<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> 1.425 +<span class="gp">... </span> <span class="n">real</span> <span class="o">=</span> <span class="n">ProductionClass</span><span class="p">()</span> 1.426 +<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> 1.427 +<span class="gp">...</span> 1.428 +<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><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> 1.429 +</pre></div> 1.430 +</div> 1.431 +<p>As an alternative <cite>patch</cite>, <cite>patch.object</cite> and <cite>patch.dict</cite> can be used as 1.432 +class decorators. When used in this way it is the same as applying the 1.433 +decorator indvidually to every method whose name starts with “test”.</p> 1.434 +<p>For some more advanced examples, see the <a class="reference internal" href="examples.html#further-examples"><em>Further Examples</em></a> page.</p> 1.435 +</div> 1.436 +</div> 1.437 + 1.438 + 1.439 + </div> 1.440 + </div> 1.441 + </div> 1.442 + <div class="sphinxsidebar"> 1.443 + <div class="sphinxsidebarwrapper"> 1.444 + <h3><a href="index.html">Table Of Contents</a></h3> 1.445 + <ul> 1.446 +<li><a class="reference internal" href="#">Getting Started with Mock</a><ul> 1.447 +<li><a class="reference internal" href="#using-mock">Using Mock</a><ul> 1.448 +<li><a class="reference internal" href="#mock-patching-methods">Mock Patching Methods</a></li> 1.449 +<li><a class="reference internal" href="#mock-for-method-calls-on-an-object">Mock for Method Calls on an Object</a></li> 1.450 +<li><a class="reference internal" href="#mocking-classes">Mocking Classes</a></li> 1.451 +<li><a class="reference internal" href="#naming-your-mocks">Naming your mocks</a></li> 1.452 +<li><a class="reference internal" href="#tracking-all-calls">Tracking all Calls</a></li> 1.453 +<li><a class="reference internal" href="#setting-return-values-and-attributes">Setting Return Values and Attributes</a></li> 1.454 +<li><a class="reference internal" href="#raising-exceptions-with-mocks">Raising exceptions with mocks</a></li> 1.455 +<li><a class="reference internal" href="#side-effect-functions-and-iterables">Side effect functions and iterables</a></li> 1.456 +<li><a class="reference internal" href="#creating-a-mock-from-an-existing-object">Creating a Mock from an Existing Object</a></li> 1.457 +</ul> 1.458 +</li> 1.459 +<li><a class="reference internal" href="#patch-decorators">Patch Decorators</a></li> 1.460 +</ul> 1.461 +</li> 1.462 +</ul> 1.463 + 1.464 + <h4>Previous topic</h4> 1.465 + <p class="topless"><a href="magicmock.html" 1.466 + title="previous chapter">Mocking Magic Methods</a></p> 1.467 + <h4>Next topic</h4> 1.468 + <p class="topless"><a href="examples.html" 1.469 + title="next chapter">Further Examples</a></p> 1.470 + <h3>This Page</h3> 1.471 + <ul class="this-page-menu"> 1.472 + <li><a href="_sources/getting-started.txt" 1.473 + rel="nofollow">Show Source</a></li> 1.474 + </ul> 1.475 +<div id="searchbox" style="display: none"> 1.476 + <h3>Quick search</h3> 1.477 + <form class="search" action="search.html" method="get"> 1.478 + <input type="text" name="q" /> 1.479 + <input type="submit" value="Go" /> 1.480 + <input type="hidden" name="check_keywords" value="yes" /> 1.481 + <input type="hidden" name="area" value="default" /> 1.482 + </form> 1.483 + <p class="searchtip" style="font-size: 90%"> 1.484 + Enter search terms or a module, class or function name. 1.485 + </p> 1.486 +</div> 1.487 +<script type="text/javascript">$('#searchbox').show(0);</script> 1.488 + </div> 1.489 + </div> 1.490 + <div class="clearer"></div> 1.491 + </div> 1.492 + <div class="related"> 1.493 + <h3>Navigation</h3> 1.494 + <ul> 1.495 + <li class="right" style="margin-right: 10px"> 1.496 + <a href="genindex.html" title="General Index" 1.497 + >index</a></li> 1.498 + <li class="right" > 1.499 + <a href="examples.html" title="Further Examples" 1.500 + >next</a> |</li> 1.501 + <li class="right" > 1.502 + <a href="magicmock.html" title="Mocking Magic Methods" 1.503 + >previous</a> |</li> 1.504 + <li><a href="index.html">Mock 1.0.0 documentation</a> »</li> 1.505 + </ul> 1.506 + </div> 1.507 + <div class="footer"> 1.508 + © Copyright 2007-2012, Michael Foord & the mock team. 1.509 + Last updated on Oct 07, 2012. 1.510 + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. 1.511 + </div> 1.512 + </body> 1.513 +</html> 1.514 \ No newline at end of file