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