python/mock-1.0.0/html/mocksignature.html

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/python/mock-1.0.0/html/mocksignature.html	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,352 @@
     1.4 +
     1.5 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     1.6 +  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     1.7 +
     1.8 +
     1.9 +<html xmlns="http://www.w3.org/1999/xhtml">
    1.10 +  <head>
    1.11 +    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    1.12 +    
    1.13 +    <title>mocksignature &mdash; Mock 0.8.1alpha1 documentation</title>
    1.14 +    
    1.15 +    <link rel="stylesheet" href="_static/nature.css" type="text/css" />
    1.16 +    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    1.17 +    
    1.18 +    <script type="text/javascript">
    1.19 +      var DOCUMENTATION_OPTIONS = {
    1.20 +        URL_ROOT:    '',
    1.21 +        VERSION:     '0.8.1alpha1',
    1.22 +        COLLAPSE_INDEX: false,
    1.23 +        FILE_SUFFIX: '.html',
    1.24 +        HAS_SOURCE:  true
    1.25 +      };
    1.26 +    </script>
    1.27 +    <script type="text/javascript" src="_static/jquery.js"></script>
    1.28 +    <script type="text/javascript" src="_static/underscore.js"></script>
    1.29 +    <script type="text/javascript" src="_static/doctools.js"></script>
    1.30 +    <link rel="top" title="Mock 0.8.1alpha1 documentation" href="index.html" />
    1.31 +    <link rel="next" title="Getting Started with Mock" href="getting-started.html" />
    1.32 +    <link rel="prev" title="Mocking Magic Methods" href="magicmock.html" /> 
    1.33 +  </head>
    1.34 +  <body>
    1.35 +    <div class="related">
    1.36 +      <h3>Navigation</h3>
    1.37 +      <ul>
    1.38 +        <li class="right" style="margin-right: 10px">
    1.39 +          <a href="genindex.html" title="General Index"
    1.40 +             accesskey="I">index</a></li>
    1.41 +        <li class="right" >
    1.42 +          <a href="getting-started.html" title="Getting Started with Mock"
    1.43 +             accesskey="N">next</a> |</li>
    1.44 +        <li class="right" >
    1.45 +          <a href="magicmock.html" title="Mocking Magic Methods"
    1.46 +             accesskey="P">previous</a> |</li>
    1.47 +        <li><a href="index.html">Mock 0.8.1alpha1 documentation</a> &raquo;</li> 
    1.48 +      </ul>
    1.49 +    </div>  
    1.50 +
    1.51 +    <div class="document">
    1.52 +      <div class="documentwrapper">
    1.53 +        <div class="bodywrapper">
    1.54 +          <div class="body">
    1.55 +            
    1.56 +  <div class="section" id="mocksignature">
    1.57 +<h1>mocksignature<a class="headerlink" href="#mocksignature" title="Permalink to this headline">¶</a></h1>
    1.58 +<div class="admonition note">
    1.59 +<p class="first admonition-title">Note</p>
    1.60 +<p class="last"><a class="reference internal" href="helpers.html#auto-speccing"><em>Autospeccing</em></a>, added in mock 0.8, is a more advanced version of
    1.61 +<cite>mocksignature</cite> and can be used for many of the same use cases.</p>
    1.62 +</div>
    1.63 +<p>A problem with using mock objects to replace real objects in your tests is that
    1.64 +<a class="reference internal" href="mock.html#mock.Mock" title="mock.Mock"><tt class="xref py py-class docutils literal"><span class="pre">Mock</span></tt></a> can be <em>too</em> flexible. Your code can treat the mock objects in
    1.65 +any way and you have to manually check that they were called correctly. If your
    1.66 +code calls functions or methods with the wrong number of arguments then mocks
    1.67 +don&#8217;t complain.</p>
    1.68 +<p>The solution to this is <cite>mocksignature</cite>, which creates functions with the
    1.69 +same signature as the original, but delegating to a mock. You can interrogate
    1.70 +the mock in the usual way to check it has been called with the <em>right</em>
    1.71 +arguments, but if it is called with the wrong number of arguments it will
    1.72 +raise a <cite>TypeError</cite> in the same way your production code would.</p>
    1.73 +<p>Another advantage is that your mocked objects are real functions, which can
    1.74 +be useful when your code uses
    1.75 +<a class="reference external" href="http://docs.python.org/library/inspect.html">inspect</a> or depends on
    1.76 +functions being function objects.</p>
    1.77 +<dl class="function">
    1.78 +<dt id="mock.mocksignature">
    1.79 +<tt class="descname">mocksignature</tt><big>(</big><em>func</em>, <em>mock=None</em>, <em>skipfirst=False</em><big>)</big><a class="headerlink" href="#mock.mocksignature" title="Permalink to this definition">¶</a></dt>
    1.80 +<dd><p>Create a new function with the same signature as <cite>func</cite> that delegates
    1.81 +to <cite>mock</cite>. If <cite>skipfirst</cite> is True the first argument is skipped, useful
    1.82 +for methods where <cite>self</cite> needs to be omitted from the new function.</p>
    1.83 +<p>If you don&#8217;t pass in a <cite>mock</cite> then one will be created for you.</p>
    1.84 +<p>Functions returned by <cite>mocksignature</cite> have many of the same attributes
    1.85 +and assert methods as a mock object.</p>
    1.86 +<p>The mock is set as the <cite>mock</cite> attribute of the returned function for easy
    1.87 +access.</p>
    1.88 +<p><cite>mocksignature</cite> can also be used with classes. It copies the signature of
    1.89 +the <cite>__init__</cite> method.</p>
    1.90 +<p>When used with callable objects (instances) it copies the signature of the
    1.91 +<cite>__call__</cite> method.</p>
    1.92 +</dd></dl>
    1.93 +
    1.94 +<p><cite>mocksignature</cite> will work out if it is mocking the signature of a method on
    1.95 +an instance or a method on a class and do the &#8220;right thing&#8221; with the <cite>self</cite>
    1.96 +argument in both cases.</p>
    1.97 +<p>Because of a limitation in the way that arguments are collected by functions
    1.98 +created by <cite>mocksignature</cite> they are <em>always</em> passed as positional arguments
    1.99 +(including defaults) and not keyword arguments.</p>
   1.100 +<div class="section" id="mocksignature-api">
   1.101 +<h2>mocksignature api<a class="headerlink" href="#mocksignature-api" title="Permalink to this headline">¶</a></h2>
   1.102 +<p>Although the objects returned by <cite>mocksignature</cite> api are real function objects,
   1.103 +they have much of the same api as the <a class="reference internal" href="mock.html#mock.Mock" title="mock.Mock"><tt class="xref py py-class docutils literal"><span class="pre">Mock</span></tt></a> class. This includes the
   1.104 +assert methods:</p>
   1.105 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
   1.106 +<span class="gp">... </span>    <span class="k">pass</span>
   1.107 +<span class="gp">...</span>
   1.108 +<span class="gp">&gt;&gt;&gt; </span><span class="n">func2</span> <span class="o">=</span> <span class="n">mocksignature</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
   1.109 +<span class="gp">&gt;&gt;&gt; </span><span class="n">func2</span><span class="o">.</span><span class="n">called</span>
   1.110 +<span class="go">False</span>
   1.111 +<span class="gp">&gt;&gt;&gt; </span><span class="n">func2</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="mi">3</span>
   1.112 +<span class="gp">&gt;&gt;&gt; </span><span class="n">func2</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
   1.113 +<span class="go">3</span>
   1.114 +<span class="gp">&gt;&gt;&gt; </span><span class="n">func2</span><span class="o">.</span><span class="n">called</span>
   1.115 +<span class="go">True</span>
   1.116 +<span class="gp">&gt;&gt;&gt; </span><span class="n">func2</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
   1.117 +<span class="gp">&gt;&gt;&gt; </span><span class="n">func2</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">4</span><span class="p">)</span>
   1.118 +<span class="gt">Traceback (most recent call last):</span>
   1.119 +  <span class="c">...</span>
   1.120 +<span class="gr">AssertionError: Expected call</span>: <span class="n">mock(1, 2, 4)</span>
   1.121 +<span class="go">Actual call: mock(1, 2, 3)</span>
   1.122 +<span class="gp">&gt;&gt;&gt; </span><span class="n">func2</span><span class="o">.</span><span class="n">call_count</span>
   1.123 +<span class="go">1</span>
   1.124 +<span class="gp">&gt;&gt;&gt; </span><span class="n">func2</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="ne">IndexError</span>
   1.125 +<span class="gp">&gt;&gt;&gt; </span><span class="n">func2</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
   1.126 +<span class="gt">Traceback (most recent call last):</span>
   1.127 +  <span class="c">...</span>
   1.128 +<span class="gr">IndexError</span>
   1.129 +</pre></div>
   1.130 +</div>
   1.131 +<p>The mock object that is being delegated to is available as the <cite>mock</cite> attribute
   1.132 +of the function created by <cite>mocksignature</cite>.</p>
   1.133 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">func2</span><span class="o">.</span><span class="n">mock</span><span class="o">.</span><span class="n">mock_calls</span>
   1.134 +<span class="go">[call(1, 2, 3), call(4, 5, 6)]</span>
   1.135 +</pre></div>
   1.136 +</div>
   1.137 +<p>The methods and attributes available on functions returned by <cite>mocksignature</cite>
   1.138 +are:</p>
   1.139 +<blockquote>
   1.140 +<div><a class="reference internal" href="mock.html#mock.Mock.assert_any_call" title="mock.Mock.assert_any_call"><tt class="xref py py-meth docutils literal"><span class="pre">assert_any_call()</span></tt></a>, <a class="reference internal" href="mock.html#mock.Mock.assert_called_once_with" title="mock.Mock.assert_called_once_with"><tt class="xref py py-meth docutils literal"><span class="pre">assert_called_once_with()</span></tt></a>,
   1.141 +<a class="reference internal" href="mock.html#mock.Mock.assert_called_with" title="mock.Mock.assert_called_with"><tt class="xref py py-meth docutils literal"><span class="pre">assert_called_with()</span></tt></a>, <a class="reference internal" href="mock.html#mock.Mock.assert_has_calls" title="mock.Mock.assert_has_calls"><tt class="xref py py-meth docutils literal"><span class="pre">assert_has_calls()</span></tt></a>,
   1.142 +<a class="reference internal" href="mock.html#mock.Mock.call_args" title="mock.Mock.call_args"><tt class="xref py py-attr docutils literal"><span class="pre">call_args</span></tt></a>, <a class="reference internal" href="mock.html#mock.Mock.call_args_list" title="mock.Mock.call_args_list"><tt class="xref py py-attr docutils literal"><span class="pre">call_args_list</span></tt></a>,
   1.143 +<a class="reference internal" href="mock.html#mock.Mock.call_count" title="mock.Mock.call_count"><tt class="xref py py-attr docutils literal"><span class="pre">call_count</span></tt></a>, <a class="reference internal" href="mock.html#mock.Mock.called" title="mock.Mock.called"><tt class="xref py py-attr docutils literal"><span class="pre">called</span></tt></a>,
   1.144 +<a class="reference internal" href="mock.html#mock.Mock.method_calls" title="mock.Mock.method_calls"><tt class="xref py py-attr docutils literal"><span class="pre">method_calls</span></tt></a>, <cite>mock</cite>, <a class="reference internal" href="mock.html#mock.Mock.mock_calls" title="mock.Mock.mock_calls"><tt class="xref py py-attr docutils literal"><span class="pre">mock_calls</span></tt></a>,
   1.145 +<a class="reference internal" href="mock.html#mock.Mock.reset_mock" title="mock.Mock.reset_mock"><tt class="xref py py-meth docutils literal"><span class="pre">reset_mock()</span></tt></a>, <a class="reference internal" href="mock.html#mock.Mock.return_value" title="mock.Mock.return_value"><tt class="xref py py-attr docutils literal"><span class="pre">return_value</span></tt></a>, and
   1.146 +<a class="reference internal" href="mock.html#mock.Mock.side_effect" title="mock.Mock.side_effect"><tt class="xref py py-attr docutils literal"><span class="pre">side_effect</span></tt></a>.</div></blockquote>
   1.147 +</div>
   1.148 +<div class="section" id="example-use">
   1.149 +<h2>Example use<a class="headerlink" href="#example-use" title="Permalink to this headline">¶</a></h2>
   1.150 +<div class="section" id="basic-use">
   1.151 +<h3>Basic use<a class="headerlink" href="#basic-use" title="Permalink to this headline">¶</a></h3>
   1.152 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">function</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="o">=</span><span class="bp">None</span><span class="p">):</span>
   1.153 +<span class="gp">... </span>    <span class="k">pass</span>
   1.154 +<span class="gp">...</span>
   1.155 +<span class="gp">&gt;&gt;&gt; </span><span class="n">mock</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
   1.156 +<span class="gp">&gt;&gt;&gt; </span><span class="n">function</span> <span class="o">=</span> <span class="n">mocksignature</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="n">mock</span><span class="p">)</span>
   1.157 +<span class="gp">&gt;&gt;&gt; </span><span class="n">function</span><span class="p">()</span>
   1.158 +<span class="gt">Traceback (most recent call last):</span>
   1.159 +  <span class="c">...</span>
   1.160 +<span class="gr">TypeError</span>: <span class="n">&lt;lambda&gt;() takes at least 2 arguments (0 given)</span>
   1.161 +<span class="gp">&gt;&gt;&gt; </span><span class="n">function</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="s">&#39;some value&#39;</span>
   1.162 +<span class="gp">&gt;&gt;&gt; </span><span class="n">function</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="s">&#39;foo&#39;</span><span class="p">)</span>
   1.163 +<span class="go">&#39;some value&#39;</span>
   1.164 +<span class="gp">&gt;&gt;&gt; </span><span class="n">function</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="s">&#39;foo&#39;</span><span class="p">)</span>
   1.165 +</pre></div>
   1.166 +</div>
   1.167 +</div>
   1.168 +<div class="section" id="keyword-arguments">
   1.169 +<h3>Keyword arguments<a class="headerlink" href="#keyword-arguments" title="Permalink to this headline">¶</a></h3>
   1.170 +<p>Note that arguments to functions created by <cite>mocksignature</cite> are always passed
   1.171 +in to the underlying mock by position even when called with keywords:</p>
   1.172 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">function</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="o">=</span><span class="bp">None</span><span class="p">):</span>
   1.173 +<span class="gp">... </span>    <span class="k">pass</span>
   1.174 +<span class="gp">...</span>
   1.175 +<span class="gp">&gt;&gt;&gt; </span><span class="n">function</span> <span class="o">=</span> <span class="n">mocksignature</span><span class="p">(</span><span class="n">function</span><span class="p">)</span>
   1.176 +<span class="gp">&gt;&gt;&gt; </span><span class="n">function</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="bp">None</span>
   1.177 +<span class="gp">&gt;&gt;&gt; </span><span class="n">function</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
   1.178 +<span class="gp">&gt;&gt;&gt; </span><span class="n">function</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="bp">None</span><span class="p">)</span>
   1.179 +</pre></div>
   1.180 +</div>
   1.181 +</div>
   1.182 +<div class="section" id="mocking-methods-and-self">
   1.183 +<h3>Mocking methods and self<a class="headerlink" href="#mocking-methods-and-self" title="Permalink to this headline">¶</a></h3>
   1.184 +<p>When you use <cite>mocksignature</cite> to replace a method on a class then <cite>self</cite>
   1.185 +will be included in the method signature - and you will need to include
   1.186 +the instance when you do your asserts.</p>
   1.187 +<p>As a curious factor of the way Python (2) wraps methods fetched from a class,
   1.188 +we can <em>get</em> the <cite>return_value</cite> from a function set on a class, but we can&#8217;t
   1.189 +set it. We have to do this through the exposed <cite>mock</cite> attribute instead:</p>
   1.190 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">SomeClass</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
   1.191 +<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> <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="o">=</span><span class="bp">None</span><span class="p">):</span>
   1.192 +<span class="gp">... </span>        <span class="k">pass</span>
   1.193 +<span class="gp">...</span>
   1.194 +<span class="gp">&gt;&gt;&gt; </span><span class="n">SomeClass</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">mocksignature</span><span class="p">(</span><span class="n">SomeClass</span><span class="o">.</span><span class="n">method</span><span class="p">)</span>
   1.195 +<span class="gp">&gt;&gt;&gt; </span><span class="n">SomeClass</span><span class="o">.</span><span class="n">method</span><span class="o">.</span><span class="n">mock</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="bp">None</span>
   1.196 +<span class="gp">&gt;&gt;&gt; </span><span class="n">instance</span> <span class="o">=</span> <span class="n">SomeClass</span><span class="p">()</span>
   1.197 +<span class="gp">&gt;&gt;&gt; </span><span class="n">instance</span><span class="o">.</span><span class="n">method</span><span class="p">()</span>
   1.198 +<span class="gt">Traceback (most recent call last):</span>
   1.199 +  <span class="c">...</span>
   1.200 +<span class="gr">TypeError</span>: <span class="n">&lt;lambda&gt;() takes at least 4 arguments (1 given)</span>
   1.201 +<span class="gp">&gt;&gt;&gt; </span><span class="n">instance</span><span class="o">.</span><span class="n">method</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
   1.202 +<span class="gp">&gt;&gt;&gt; </span><span class="n">instance</span><span class="o">.</span><span class="n">method</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
   1.203 +</pre></div>
   1.204 +</div>
   1.205 +<p>When you use <cite>mocksignature</cite> on instance methods <cite>self</cite> isn&#8217;t included (and we
   1.206 +can set the <cite>return_value</cite> etc directly):</p>
   1.207 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">SomeClass</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
   1.208 +<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> <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="o">=</span><span class="bp">None</span><span class="p">):</span>
   1.209 +<span class="gp">... </span>        <span class="k">pass</span>
   1.210 +<span class="gp">...</span>
   1.211 +<span class="gp">&gt;&gt;&gt; </span><span class="n">instance</span> <span class="o">=</span> <span class="n">SomeClass</span><span class="p">()</span>
   1.212 +<span class="gp">&gt;&gt;&gt; </span><span class="n">instance</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">mocksignature</span><span class="p">(</span><span class="n">instance</span><span class="o">.</span><span class="n">method</span><span class="p">)</span>
   1.213 +<span class="gp">&gt;&gt;&gt; </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="bp">None</span>
   1.214 +<span class="gp">&gt;&gt;&gt; </span><span class="n">instance</span><span class="o">.</span><span class="n">method</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
   1.215 +<span class="gp">&gt;&gt;&gt; </span><span class="n">instance</span><span class="o">.</span><span class="n">method</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
   1.216 +</pre></div>
   1.217 +</div>
   1.218 +</div>
   1.219 +<div class="section" id="mocksignature-with-classes">
   1.220 +<h3>mocksignature with classes<a class="headerlink" href="#mocksignature-with-classes" title="Permalink to this headline">¶</a></h3>
   1.221 +<p>When used with a class <cite>mocksignature</cite> copies the signature of the <cite>__init__</cite>
   1.222 +method.</p>
   1.223 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Something</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
   1.224 +<span class="gp">... </span>    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">foo</span><span class="p">,</span> <span class="n">bar</span><span class="p">):</span>
   1.225 +<span class="gp">... </span>        <span class="k">pass</span>
   1.226 +<span class="gp">...</span>
   1.227 +<span class="gp">&gt;&gt;&gt; </span><span class="n">MockSomething</span> <span class="o">=</span> <span class="n">mocksignature</span><span class="p">(</span><span class="n">Something</span><span class="p">)</span>
   1.228 +<span class="gp">&gt;&gt;&gt; </span><span class="n">instance</span> <span class="o">=</span> <span class="n">MockSomething</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">9</span><span class="p">)</span>
   1.229 +<span class="gp">&gt;&gt;&gt; </span><span class="k">assert</span> <span class="n">instance</span> <span class="ow">is</span> <span class="n">MockSomething</span><span class="o">.</span><span class="n">return_value</span>
   1.230 +<span class="gp">&gt;&gt;&gt; </span><span class="n">MockSomething</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">9</span><span class="p">)</span>
   1.231 +<span class="gp">&gt;&gt;&gt; </span><span class="n">MockSomething</span><span class="p">()</span>
   1.232 +<span class="gt">Traceback (most recent call last):</span>
   1.233 +  <span class="c">...</span>
   1.234 +<span class="gr">TypeError</span>: <span class="n">&lt;lambda&gt;() takes at least 2 arguments (0 given)</span>
   1.235 +</pre></div>
   1.236 +</div>
   1.237 +<p>Because the object returned by <cite>mocksignature</cite> is a function rather than a
   1.238 +<cite>Mock</cite> you lose the other capabilities of <cite>Mock</cite>, like dynamic attribute
   1.239 +creation.</p>
   1.240 +</div>
   1.241 +<div class="section" id="mocksignature-with-callable-objects">
   1.242 +<h3>mocksignature with callable objects<a class="headerlink" href="#mocksignature-with-callable-objects" title="Permalink to this headline">¶</a></h3>
   1.243 +<p>When used with a callable object <cite>mocksignature</cite> copies the signature of the
   1.244 +<cite>__call__</cite> method.</p>
   1.245 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">Something</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
   1.246 +<span class="gp">... </span>    <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">spam</span><span class="p">,</span> <span class="n">eggs</span><span class="p">):</span>
   1.247 +<span class="gp">... </span>        <span class="k">pass</span>
   1.248 +<span class="gp">...</span>
   1.249 +<span class="gp">&gt;&gt;&gt; </span><span class="n">something</span> <span class="o">=</span> <span class="n">Something</span><span class="p">()</span>
   1.250 +<span class="gp">&gt;&gt;&gt; </span><span class="n">mock_something</span> <span class="o">=</span> <span class="n">mocksignature</span><span class="p">(</span><span class="n">something</span><span class="p">)</span>
   1.251 +<span class="gp">&gt;&gt;&gt; </span><span class="n">result</span> <span class="o">=</span> <span class="n">mock_something</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">9</span><span class="p">)</span>
   1.252 +<span class="gp">&gt;&gt;&gt; </span><span class="n">mock_something</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">9</span><span class="p">)</span>
   1.253 +<span class="gp">&gt;&gt;&gt; </span><span class="n">mock_something</span><span class="p">()</span>
   1.254 +<span class="gt">Traceback (most recent call last):</span>
   1.255 +  <span class="c">...</span>
   1.256 +<span class="gr">TypeError</span>: <span class="n">&lt;lambda&gt;() takes at least 2 arguments (0 given)</span>
   1.257 +</pre></div>
   1.258 +</div>
   1.259 +</div>
   1.260 +</div>
   1.261 +<div class="section" id="mocksignature-argument-to-patch">
   1.262 +<h2>mocksignature argument to patch<a class="headerlink" href="#mocksignature-argument-to-patch" title="Permalink to this headline">¶</a></h2>
   1.263 +<p><cite>mocksignature</cite> is available as a keyword argument to <a class="reference internal" href="patch.html#mock.patch" title="mock.patch"><tt class="xref py py-func docutils literal"><span class="pre">patch()</span></tt></a> or
   1.264 +<a class="reference internal" href="patch.html#mock.patch.object" title="mock.patch.object"><tt class="xref py py-func docutils literal"><span class="pre">patch.object()</span></tt></a>. It can be used with functions / methods / classes and
   1.265 +callable objects.</p>
   1.266 +<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">SomeClass</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
   1.267 +<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> <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="o">=</span><span class="bp">None</span><span class="p">):</span>
   1.268 +<span class="gp">... </span>        <span class="k">pass</span>
   1.269 +<span class="gp">...</span>
   1.270 +<span class="gp">&gt;&gt;&gt; </span><span class="nd">@patch.object</span><span class="p">(</span><span class="n">SomeClass</span><span class="p">,</span> <span class="s">&#39;method&#39;</span><span class="p">,</span> <span class="n">mocksignature</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
   1.271 +<span class="gp">... </span><span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="n">mock_method</span><span class="p">):</span>
   1.272 +<span class="gp">... </span>    <span class="n">instance</span> <span class="o">=</span> <span class="n">SomeClass</span><span class="p">()</span>
   1.273 +<span class="gp">... </span>    <span class="n">mock_method</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="bp">None</span>
   1.274 +<span class="gp">... </span>    <span class="n">instance</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>
   1.275 +<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="n">instance</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="bp">None</span><span class="p">)</span>
   1.276 +<span class="gp">...</span>
   1.277 +<span class="gp">&gt;&gt;&gt; </span><span class="n">test</span><span class="p">()</span>
   1.278 +</pre></div>
   1.279 +</div>
   1.280 +</div>
   1.281 +</div>
   1.282 +
   1.283 +
   1.284 +          </div>
   1.285 +        </div>
   1.286 +      </div>
   1.287 +      <div class="sphinxsidebar">
   1.288 +        <div class="sphinxsidebarwrapper">
   1.289 +  <h3><a href="index.html">Table Of Contents</a></h3>
   1.290 +  <ul>
   1.291 +<li><a class="reference internal" href="#">mocksignature</a><ul>
   1.292 +<li><a class="reference internal" href="#mocksignature-api">mocksignature api</a></li>
   1.293 +<li><a class="reference internal" href="#example-use">Example use</a><ul>
   1.294 +<li><a class="reference internal" href="#basic-use">Basic use</a></li>
   1.295 +<li><a class="reference internal" href="#keyword-arguments">Keyword arguments</a></li>
   1.296 +<li><a class="reference internal" href="#mocking-methods-and-self">Mocking methods and self</a></li>
   1.297 +<li><a class="reference internal" href="#mocksignature-with-classes">mocksignature with classes</a></li>
   1.298 +<li><a class="reference internal" href="#mocksignature-with-callable-objects">mocksignature with callable objects</a></li>
   1.299 +</ul>
   1.300 +</li>
   1.301 +<li><a class="reference internal" href="#mocksignature-argument-to-patch">mocksignature argument to patch</a></li>
   1.302 +</ul>
   1.303 +</li>
   1.304 +</ul>
   1.305 +
   1.306 +  <h4>Previous topic</h4>
   1.307 +  <p class="topless"><a href="magicmock.html"
   1.308 +                        title="previous chapter">Mocking Magic Methods</a></p>
   1.309 +  <h4>Next topic</h4>
   1.310 +  <p class="topless"><a href="getting-started.html"
   1.311 +                        title="next chapter">Getting Started with Mock</a></p>
   1.312 +  <h3>This Page</h3>
   1.313 +  <ul class="this-page-menu">
   1.314 +    <li><a href="_sources/mocksignature.txt"
   1.315 +           rel="nofollow">Show Source</a></li>
   1.316 +  </ul>
   1.317 +<div id="searchbox" style="display: none">
   1.318 +  <h3>Quick search</h3>
   1.319 +    <form class="search" action="search.html" method="get">
   1.320 +      <input type="text" name="q" />
   1.321 +      <input type="submit" value="Go" />
   1.322 +      <input type="hidden" name="check_keywords" value="yes" />
   1.323 +      <input type="hidden" name="area" value="default" />
   1.324 +    </form>
   1.325 +    <p class="searchtip" style="font-size: 90%">
   1.326 +    Enter search terms or a module, class or function name.
   1.327 +    </p>
   1.328 +</div>
   1.329 +<script type="text/javascript">$('#searchbox').show(0);</script>
   1.330 +        </div>
   1.331 +      </div>
   1.332 +      <div class="clearer"></div>
   1.333 +    </div>
   1.334 +    <div class="related">
   1.335 +      <h3>Navigation</h3>
   1.336 +      <ul>
   1.337 +        <li class="right" style="margin-right: 10px">
   1.338 +          <a href="genindex.html" title="General Index"
   1.339 +             >index</a></li>
   1.340 +        <li class="right" >
   1.341 +          <a href="getting-started.html" title="Getting Started with Mock"
   1.342 +             >next</a> |</li>
   1.343 +        <li class="right" >
   1.344 +          <a href="magicmock.html" title="Mocking Magic Methods"
   1.345 +             >previous</a> |</li>
   1.346 +        <li><a href="index.html">Mock 0.8.1alpha1 documentation</a> &raquo;</li> 
   1.347 +      </ul>
   1.348 +    </div>
   1.349 +    <div class="footer">
   1.350 +        &copy; Copyright 2007-2012, Michael Foord &amp; the mock team.
   1.351 +      Last updated on Feb 16, 2012.
   1.352 +      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
   1.353 +    </div>
   1.354 +  </body>
   1.355 +</html>
   1.356 \ No newline at end of file

mercurial