Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 ====================================
2 Mock - Mocking and Testing Library
3 ====================================
5 .. currentmodule:: mock
7 :Author: `Michael Foord
8 <http://www.voidspace.org.uk/python/weblog/index.shtml>`_
9 :Version: |release|
10 :Date: 2012/10/07
11 :Homepage: `Mock Homepage`_
12 :Download: `Mock on PyPI`_
13 :Documentation: `PDF Documentation
14 <http://www.voidspace.org.uk/downloads/mock-1.0.0.pdf>`_
15 :License: `BSD License`_
16 :Support: `Mailing list (testing-in-python@lists.idyll.org)
17 <http://lists.idyll.org/listinfo/testing-in-python>`_
18 :Issue tracker: `Google code project
19 <http://code.google.com/p/mock/issues/list>`_
21 .. _Mock Homepage: http://www.voidspace.org.uk/python/mock/
22 .. _BSD License: http://www.voidspace.org.uk/python/license.shtml
25 .. currentmodule:: mock
27 .. module:: mock
28 :synopsis: Mock object and testing library.
30 .. index:: introduction
32 mock is a library for testing in Python. It allows you to replace parts of
33 your system under test with mock objects and make assertions about how they
34 have been used.
36 mock is now part of the Python standard library, available as `unittest.mock
37 <http://docs.python.org/py3k/library/unittest.mock.html#module-unittest.mock>`_
38 in Python 3.3 onwards.
40 mock provides a core :class:`Mock` class removing the need to create a host
41 of stubs throughout your test suite. After performing an action, you can make
42 assertions about which methods / attributes were used and arguments they were
43 called with. You can also specify return values and set needed attributes in
44 the normal way.
46 Additionally, mock provides a :func:`patch` decorator that handles patching
47 module and class level attributes within the scope of a test, along with
48 :const:`sentinel` for creating unique objects. See the `quick guide`_ for
49 some examples of how to use :class:`Mock`, :class:`MagicMock` and
50 :func:`patch`.
52 Mock is very easy to use and is designed for use with
53 `unittest <http://pypi.python.org/pypi/unittest2>`_. Mock is based on
54 the 'action -> assertion' pattern instead of `'record -> replay'` used by many
55 mocking frameworks.
57 mock is tested on Python versions 2.4-2.7, Python 3 plus the latest versions of
58 Jython and PyPy.
61 .. testsetup::
63 class ProductionClass(object):
64 def method(self, *args):
65 pass
67 module = sys.modules['module'] = ProductionClass
68 ProductionClass.ClassName1 = ProductionClass
69 ProductionClass.ClassName2 = ProductionClass
73 API Documentation
74 =================
76 .. toctree::
77 :maxdepth: 2
79 mock
80 patch
81 helpers
82 sentinel
83 magicmock
86 User Guide
87 ==========
89 .. toctree::
90 :maxdepth: 2
92 getting-started
93 examples
94 compare
95 changelog
98 .. index:: installing
100 Installing
101 ==========
103 The current version is |release|. Mock is stable and widely used. If you do
104 find any bugs, or have suggestions for improvements / extensions
105 then please contact us.
107 * `mock on PyPI <http://pypi.python.org/pypi/mock>`_
108 * `mock documentation as PDF
109 <http://www.voidspace.org.uk/downloads/mock-1.0.0.pdf>`_
110 * `Google Code Home & Mercurial Repository <http://code.google.com/p/mock/>`_
112 .. index:: repository
113 .. index:: hg
115 You can checkout the latest development version from the Google Code Mercurial
116 repository with the following command:
118 ``hg clone https://mock.googlecode.com/hg/ mock``
121 .. index:: pip
122 .. index:: easy_install
123 .. index:: setuptools
125 If you have pip, setuptools or distribute you can install mock with:
127 | ``easy_install -U mock``
128 | ``pip install -U mock``
130 Alternatively you can download the mock distribution from PyPI and after
131 unpacking run:
133 ``python setup.py install``
136 Quick Guide
137 ===========
139 :class:`Mock` and :class:`MagicMock` objects create all attributes and
140 methods as you access them and store details of how they have been used. You
141 can configure them, to specify return values or limit what attributes are
142 available, and then make assertions about how they have been used:
144 .. doctest::
146 >>> from mock import MagicMock
147 >>> thing = ProductionClass()
148 >>> thing.method = MagicMock(return_value=3)
149 >>> thing.method(3, 4, 5, key='value')
150 3
151 >>> thing.method.assert_called_with(3, 4, 5, key='value')
153 :attr:`side_effect` allows you to perform side effects, including raising an
154 exception when a mock is called:
156 .. doctest::
158 >>> mock = Mock(side_effect=KeyError('foo'))
159 >>> mock()
160 Traceback (most recent call last):
161 ...
162 KeyError: 'foo'
164 >>> values = {'a': 1, 'b': 2, 'c': 3}
165 >>> def side_effect(arg):
166 ... return values[arg]
167 ...
168 >>> mock.side_effect = side_effect
169 >>> mock('a'), mock('b'), mock('c')
170 (1, 2, 3)
171 >>> mock.side_effect = [5, 4, 3, 2, 1]
172 >>> mock(), mock(), mock()
173 (5, 4, 3)
175 Mock has many other ways you can configure it and control its behaviour. For
176 example the `spec` argument configures the mock to take its specification
177 from another object. Attempting to access attributes or methods on the mock
178 that don't exist on the spec will fail with an `AttributeError`.
180 The :func:`patch` decorator / context manager makes it easy to mock classes or
181 objects in a module under test. The object you specify will be replaced with a
182 mock (or other object) during the test and restored when the test ends:
184 .. doctest::
186 >>> from mock import patch
187 >>> @patch('module.ClassName2')
188 ... @patch('module.ClassName1')
189 ... def test(MockClass1, MockClass2):
190 ... module.ClassName1()
191 ... module.ClassName2()
193 ... assert MockClass1 is module.ClassName1
194 ... assert MockClass2 is module.ClassName2
195 ... assert MockClass1.called
196 ... assert MockClass2.called
197 ...
198 >>> test()
200 .. note::
202 When you nest patch decorators the mocks are passed in to the decorated
203 function in the same order they applied (the normal *python* order that
204 decorators are applied). This means from the bottom up, so in the example
205 above the mock for `module.ClassName1` is passed in first.
207 With `patch` it matters that you patch objects in the namespace where they
208 are looked up. This is normally straightforward, but for a quick guide
209 read :ref:`where to patch <where-to-patch>`.
211 As well as a decorator `patch` can be used as a context manager in a with
212 statement:
214 .. doctest::
216 >>> with patch.object(ProductionClass, 'method', return_value=None) as mock_method:
217 ... thing = ProductionClass()
218 ... thing.method(1, 2, 3)
219 ...
220 >>> mock_method.assert_called_once_with(1, 2, 3)
223 There is also :func:`patch.dict` for setting values in a dictionary just
224 during a scope and restoring the dictionary to its original state when the test
225 ends:
227 .. doctest::
229 >>> foo = {'key': 'value'}
230 >>> original = foo.copy()
231 >>> with patch.dict(foo, {'newkey': 'newvalue'}, clear=True):
232 ... assert foo == {'newkey': 'newvalue'}
233 ...
234 >>> assert foo == original
236 Mock supports the mocking of Python :ref:`magic methods <magic-methods>`. The
237 easiest way of using magic methods is with the :class:`MagicMock` class. It
238 allows you to do things like:
240 .. doctest::
242 >>> mock = MagicMock()
243 >>> mock.__str__.return_value = 'foobarbaz'
244 >>> str(mock)
245 'foobarbaz'
246 >>> mock.__str__.assert_called_with()
248 Mock allows you to assign functions (or other Mock instances) to magic methods
249 and they will be called appropriately. The `MagicMock` class is just a Mock
250 variant that has all of the magic methods pre-created for you (well, all the
251 useful ones anyway).
253 The following is an example of using magic methods with the ordinary Mock
254 class:
256 .. doctest::
258 >>> mock = Mock()
259 >>> mock.__str__ = Mock(return_value='wheeeeee')
260 >>> str(mock)
261 'wheeeeee'
263 For ensuring that the mock objects in your tests have the same api as the
264 objects they are replacing, you can use :ref:`auto-speccing <auto-speccing>`.
265 Auto-speccing can be done through the `autospec` argument to patch, or the
266 :func:`create_autospec` function. Auto-speccing creates mock objects that
267 have the same attributes and methods as the objects they are replacing, and
268 any functions and methods (including constructors) have the same call
269 signature as the real object.
271 This ensures that your mocks will fail in the same way as your production
272 code if they are used incorrectly:
274 .. doctest::
276 >>> from mock import create_autospec
277 >>> def function(a, b, c):
278 ... pass
279 ...
280 >>> mock_function = create_autospec(function, return_value='fishy')
281 >>> mock_function(1, 2, 3)
282 'fishy'
283 >>> mock_function.assert_called_once_with(1, 2, 3)
284 >>> mock_function('wrong arguments')
285 Traceback (most recent call last):
286 ...
287 TypeError: <lambda>() takes exactly 3 arguments (1 given)
289 `create_autospec` can also be used on classes, where it copies the signature of
290 the `__init__` method, and on callable objects where it copies the signature of
291 the `__call__` method.
294 .. index:: references
295 .. index:: articles
297 References
298 ==========
300 Articles, blog entries and other stuff related to testing with Mock:
302 * `Imposing a No DB Discipline on Django unit tests
303 <https://github.com/carljm/django-testing-slides/blob/master/models/30_no_database.md>`_
304 * `mock-django: tools for mocking the Django ORM and models
305 <https://github.com/dcramer/mock-django>`_
306 * `PyCon 2011 Video: Testing with mock <https://blip.tv/file/4881513>`_
307 * `Mock objects in Python
308 <http://noopenblockers.com/2012/01/06/mock-objects-in-python/>`_
309 * `Python: Injecting Mock Objects for Powerful Testing
310 <http://blueprintforge.com/blog/2012/01/08/python-injecting-mock-objects-for-powerful-testing/>`_
311 * `Python Mock: How to assert a substring of logger output
312 <http://www.michaelpollmeier.com/python-mock-how-to-assert-a-substring-of-logger-output/>`_
313 * `Mocking Django <http://www.mattjmorrison.com/2011/09/mocking-django.html>`_
314 * `Mocking dates and other classes that can't be modified
315 <http://williamjohnbert.com/2011/07/how-to-unit-testing-in-django-with-mocking-and-patching/>`_
316 * `Mock recipes <http://konryd.blogspot.com/2010/06/mock-recipies.html>`_
317 * `Mockity mock mock - some love for the mock module
318 <http://konryd.blogspot.com/2010/05/mockity-mock-mock-some-love-for-mock.html>`_
319 * `Coverage and Mock (with django)
320 <http://mattsnider.com/python/mock-and-coverage/>`_
321 * `Python Unit Testing with Mock <http://www.insomnihack.com/?p=194>`_
322 * `Getting started with Python Mock
323 <http://myadventuresincoding.wordpress.com/2011/02/26/python-python-mock-cheat-sheet/>`_
324 * `Smart Parameter Checks with mock
325 <http://tobyho.com/2011/03/24/smart-parameter-checks-in/>`_
326 * `Python mock testing techniques and tools
327 <http://agiletesting.blogspot.com/2009/07/python-mock-testing-techniques-and.html>`_
328 * `How To Test Django Template Tags
329 <http://techblog.ironfroggy.com/2008/10/how-to-test.html>`_
330 * `A presentation on Unit Testing with Mock
331 <http://pypap.blogspot.com/2008/10/newbie-nugget-unit-testing-with-mock.html>`_
332 * `Mocking with Django and Google AppEngine
333 <http://michael-a-nelson.blogspot.com/2008/09/mocking-with-django-and-google-app.html>`_
336 .. index:: tests
337 .. index:: unittest2
339 Tests
340 =====
342 Mock uses `unittest2 <http://pypi.python.org/pypi/unittest2>`_ for its own
343 test suite. In order to run it, use the `unit2` script that comes with
344 `unittest2` module on a checkout of the source repository:
346 `unit2 discover`
348 If you have `setuptools <http://pypi.python.org/pypi/distribute>`_ as well as
349 unittest2 you can run:
351 ``python setup.py test``
353 On Python 3.2 you can use ``unittest`` module from the standard library.
355 ``python3.2 -m unittest discover``
357 .. index:: Python 3
359 On Python 3 the tests for unicode are skipped as they are not relevant. On
360 Python 2.4 tests that use the with statements are skipped as the with statement
361 is invalid syntax on Python 2.4.
364 .. index:: older versions
366 Older Versions
367 ==============
369 Documentation for older versions of mock:
371 * `mock 0.8 <http://www.voidspace.org.uk/python/mock/0.8/>`_
372 * `mock 0.7 <http://www.voidspace.org.uk/python/mock/0.7/>`_
373 * `mock 0.6 <http://www.voidspace.org.uk/python/mock/0.6.0/>`_
375 Docs from the in-development version of `mock` can be found at
376 `mock.readthedocs.org <http://mock.readthedocs.org>`_.
379 Terminology
380 ===========
382 Terminology for objects used to replace other ones can be confusing. Terms
383 like double, fake, mock, stub, and spy are all used with varying meanings.
385 In `classic mock terminology
386 <http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html>`_
387 :class:`mock.Mock` is a `spy <http://xunitpatterns.com/Test%20Spy.html>`_ that
388 allows for *post-mortem* examination. This is what I call the "action ->
389 assertion" [#]_ pattern of testing.
391 I'm not however a fan of this "statically typed mocking terminology"
392 promulgated by `Martin Fowler
393 <http://martinfowler.com/articles/mocksArentStubs.html>`_. It confuses usage
394 patterns with implementation and prevents you from using natural terminology
395 when discussing mocking.
397 I much prefer duck typing, if an object used in your test suite looks like a
398 mock object and quacks like a mock object then it's fine to call it a mock, no
399 matter what the implementation looks like.
401 This terminology is perhaps more useful in less capable languages where
402 different usage patterns will *require* different implementations.
403 `mock.Mock()` is capable of being used in most of the different roles
404 described by Fowler, except (annoyingly / frustratingly / ironically) a Mock
405 itself!
407 How about a simpler definition: a "mock object" is an object used to replace a
408 real one in a system under test.
410 .. [#] This pattern is called "AAA" by some members of the testing community;
411 "Arrange - Act - Assert".