Wed, 31 Dec 2014 07:22:50 +0100
Correct previous dual key logic pending first delivery installment.
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 — 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> »</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">>>> </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">>>> </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> |
michael@0 | 68 | <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> |
michael@0 | 69 | <span class="go"><MagicMock name='method()' id='...'></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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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’t have to do any work to provide the ‘close’ method on our mock. |
michael@0 | 123 | Accessing close creates it. So, if ‘close’ hasn’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 “mock instance” |
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">>>> </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">>>> </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> |
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">'the result'</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">'the result'</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">>>> </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> |
michael@0 | 155 | <span class="gp">>>> </span><span class="n">mock</span> |
michael@0 | 156 | <span class="go"><MagicMock name='foo' id='...'></span> |
michael@0 | 157 | <span class="gp">>>> </span><span class="n">mock</span><span class="o">.</span><span class="n">method</span> |
michael@0 | 158 | <span class="go"><MagicMock name='foo.method' id='...'></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">>>> </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">>>> </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"><MagicMock name='mock.method()' id='...'></span> |
michael@0 | 170 | <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> |
michael@0 | 171 | <span class="go"><MagicMock name='mock.attribute.method()' id='...'></span> |
michael@0 | 172 | <span class="gp">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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(“SELECT 1”)</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 “chained call” like |
michael@0 | 221 | this for easy assertion afterwards:</p> |
michael@0 | 222 | <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> |
michael@0 | 223 | <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> |
michael@0 | 224 | <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> |
michael@0 | 225 | <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> |
michael@0 | 226 | <span class="go">['foo']</span> |
michael@0 | 227 | <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> |
michael@0 | 228 | <span class="gp">>>> </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('SELECT 1')]</span> |
michael@0 | 230 | <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> |
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">>>> </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> |
michael@0 | 243 | <span class="gp">>>> </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">>>> </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">>>> </span><span class="n">mock</span><span class="p">()</span> |
michael@0 | 259 | <span class="go">4</span> |
michael@0 | 260 | <span class="gp">>>> </span><span class="n">mock</span><span class="p">()</span> |
michael@0 | 261 | <span class="go">5</span> |
michael@0 | 262 | <span class="gp">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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’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">>>> </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">>>> </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 'old_method'</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. ‘patch.object’ 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">>>> </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">>>> </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> |
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">>>> </span><span class="n">test</span><span class="p">()</span> |
michael@0 | 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">original</span> |
michael@0 | 336 | |
michael@0 | 337 | <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> |
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">>>> </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">>>> </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">>>> </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> |
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">'filename'</span><span class="p">,</span> <span class="s">'r'</span><span class="p">)</span> |
michael@0 | 350 | <span class="gp">...</span> |
michael@0 | 351 | <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> |
michael@0 | 352 | <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> |
michael@0 | 353 | </pre></div> |
michael@0 | 354 | </div> |
michael@0 | 355 | <p>The module name can be ‘dotted’, in the form <cite>package.module</cite> if needed:</p> |
michael@0 | 356 | <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> |
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">>>> </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">>>> </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">'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 | 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">>>> </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">>>> </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> |
michael@0 | 372 | <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> |
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">>>> </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">'static_method'</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">>>> </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> |
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">>>> </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">'package.module.ClassName1'</span><span class="p">)</span> |
michael@0 | 390 | <span class="gp">... </span> <span class="nd">@patch</span><span class="p">(</span><span class="s">'package.module.ClassName2'</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">>>> </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> |
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">>>> </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> |
michael@0 | 406 | <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> |
michael@0 | 407 | <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> |
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">'newkey'</span><span class="p">:</span> <span class="s">'newvalue'</span><span class="p">}</span> |
michael@0 | 409 | <span class="gp">...</span> |
michael@0 | 410 | <span class="gp">>>> </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 “as” form of the with statement:</p> |
michael@0 | 416 | <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> |
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">>>> </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> |
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">>>> </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 “test”.</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> »</li> |
michael@0 | 502 | </ul> |
michael@0 | 503 | </div> |
michael@0 | 504 | <div class="footer"> |
michael@0 | 505 | © Copyright 2007-2012, Michael Foord & 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> |