|  | ==================================== | 
|  | Mock - Mocking and Testing Library | 
|  | ==================================== | 
|  |  | 
|  | .. currentmodule:: mock | 
|  |  | 
|  | :Author: `Michael Foord | 
|  | <http://www.voidspace.org.uk/python/weblog/index.shtml>`_ | 
|  | :Version: |release| | 
|  | :Date: 2012/10/07 | 
|  | :Homepage: `Mock Homepage`_ | 
|  | :Download: `Mock on PyPI`_ | 
|  | :Documentation: `PDF Documentation | 
|  | <http://www.voidspace.org.uk/downloads/mock-1.0.0.pdf>`_ | 
|  | :License: `BSD License`_ | 
|  | :Support: `Mailing list (testing-in-python@lists.idyll.org) | 
|  | <http://lists.idyll.org/listinfo/testing-in-python>`_ | 
|  | :Issue tracker: `Google code project | 
|  | <http://code.google.com/p/mock/issues/list>`_ | 
|  |  | 
|  | .. _Mock Homepage: http://www.voidspace.org.uk/python/mock/ | 
|  | .. _BSD License: http://www.voidspace.org.uk/python/license.shtml | 
|  |  | 
|  |  | 
|  | .. currentmodule:: mock | 
|  |  | 
|  | .. module:: mock | 
|  | :synopsis: Mock object and testing library. | 
|  |  | 
|  | .. index:: introduction | 
|  |  | 
|  | mock is a library for testing in Python. It allows you to replace parts of | 
|  | your system under test with mock objects and make assertions about how they | 
|  | have been used. | 
|  |  | 
|  | mock is now part of the Python standard library, available as `unittest.mock | 
|  | <http://docs.python.org/py3k/library/unittest.mock.html#module-unittest.mock>`_ | 
|  | in Python 3.3 onwards. | 
|  |  | 
|  | mock provides a core :class:`Mock` class removing the need to create a host | 
|  | of stubs throughout your test suite. After performing an action, you can make | 
|  | assertions about which methods / attributes were used and arguments they were | 
|  | called with. You can also specify return values and set needed attributes in | 
|  | the normal way. | 
|  |  | 
|  | Additionally, mock provides a :func:`patch` decorator that handles patching | 
|  | module and class level attributes within the scope of a test, along with | 
|  | :const:`sentinel` for creating unique objects. See the `quick guide`_ for | 
|  | some examples of how to use :class:`Mock`, :class:`MagicMock` and | 
|  | :func:`patch`. | 
|  |  | 
|  | Mock is very easy to use and is designed for use with | 
|  | `unittest <http://pypi.python.org/pypi/unittest2>`_. Mock is based on | 
|  | the 'action -> assertion' pattern instead of `'record -> replay'` used by many | 
|  | mocking frameworks. | 
|  |  | 
|  | mock is tested on Python versions 2.4-2.7, Python 3 plus the latest versions of | 
|  | Jython and PyPy. | 
|  |  | 
|  |  | 
|  | .. testsetup:: | 
|  |  | 
|  | class ProductionClass(object): | 
|  | def method(self, *args): | 
|  | pass | 
|  |  | 
|  | module = sys.modules['module'] = ProductionClass | 
|  | ProductionClass.ClassName1 = ProductionClass | 
|  | ProductionClass.ClassName2 = ProductionClass | 
|  |  | 
|  |  | 
|  |  | 
|  | API Documentation | 
|  | ================= | 
|  |  | 
|  | .. toctree:: | 
|  | :maxdepth: 2 | 
|  |  | 
|  | mock | 
|  | patch | 
|  | helpers | 
|  | sentinel | 
|  | magicmock | 
|  |  | 
|  |  | 
|  | User Guide | 
|  | ========== | 
|  |  | 
|  | .. toctree:: | 
|  | :maxdepth: 2 | 
|  |  | 
|  | getting-started | 
|  | examples | 
|  | compare | 
|  | changelog | 
|  |  | 
|  |  | 
|  | .. index:: installing | 
|  |  | 
|  | Installing | 
|  | ========== | 
|  |  | 
|  | The current version is |release|. Mock is stable and widely used. If you do | 
|  | find any bugs, or have suggestions for improvements / extensions | 
|  | then please contact us. | 
|  |  | 
|  | * `mock on PyPI <http://pypi.python.org/pypi/mock>`_ | 
|  | * `mock documentation as PDF | 
|  | <http://www.voidspace.org.uk/downloads/mock-1.0.0.pdf>`_ | 
|  | * `Google Code Home & Mercurial Repository <http://code.google.com/p/mock/>`_ | 
|  |  | 
|  | .. index:: repository | 
|  | .. index:: hg | 
|  |  | 
|  | You can checkout the latest development version from the Google Code Mercurial | 
|  | repository with the following command: | 
|  |  | 
|  | ``hg clone https://mock.googlecode.com/hg/ mock`` | 
|  |  | 
|  |  | 
|  | .. index:: pip | 
|  | .. index:: easy_install | 
|  | .. index:: setuptools | 
|  |  | 
|  | If you have pip, setuptools or distribute you can install mock with: | 
|  |  | 
|  | | ``easy_install -U mock`` | 
|  | | ``pip install -U mock`` | 
|  |  | 
|  | Alternatively you can download the mock distribution from PyPI and after | 
|  | unpacking run: | 
|  |  | 
|  | ``python setup.py install`` | 
|  |  | 
|  |  | 
|  | Quick Guide | 
|  | =========== | 
|  |  | 
|  | :class:`Mock` and :class:`MagicMock` objects create all attributes and | 
|  | methods as you access them and store details of how they have been used. You | 
|  | can configure them, to specify return values or limit what attributes are | 
|  | available, and then make assertions about how they have been used: | 
|  |  | 
|  | .. doctest:: | 
|  |  | 
|  | >>> from mock import MagicMock | 
|  | >>> thing = ProductionClass() | 
|  | >>> thing.method = MagicMock(return_value=3) | 
|  | >>> thing.method(3, 4, 5, key='value') | 
|  | 3 | 
|  | >>> thing.method.assert_called_with(3, 4, 5, key='value') | 
|  |  | 
|  | :attr:`side_effect` allows you to perform side effects, including raising an | 
|  | exception when a mock is called: | 
|  |  | 
|  | .. doctest:: | 
|  |  | 
|  | >>> mock = Mock(side_effect=KeyError('foo')) | 
|  | >>> mock() | 
|  | Traceback (most recent call last): | 
|  | ... | 
|  | KeyError: 'foo' | 
|  |  | 
|  | >>> values = {'a': 1, 'b': 2, 'c': 3} | 
|  | >>> def side_effect(arg): | 
|  | ...     return values[arg] | 
|  | ... | 
|  | >>> mock.side_effect = side_effect | 
|  | >>> mock('a'), mock('b'), mock('c') | 
|  | (1, 2, 3) | 
|  | >>> mock.side_effect = [5, 4, 3, 2, 1] | 
|  | >>> mock(), mock(), mock() | 
|  | (5, 4, 3) | 
|  |  | 
|  | Mock has many other ways you can configure it and control its behaviour. For | 
|  | example the `spec` argument configures the mock to take its specification | 
|  | from another object. Attempting to access attributes or methods on the mock | 
|  | that don't exist on the spec will fail with an `AttributeError`. | 
|  |  | 
|  | The :func:`patch` decorator / context manager makes it easy to mock classes or | 
|  | objects in a module under test. The object you specify will be replaced with a | 
|  | mock (or other object) during the test and restored when the test ends: | 
|  |  | 
|  | .. doctest:: | 
|  |  | 
|  | >>> from mock import patch | 
|  | >>> @patch('module.ClassName2') | 
|  | ... @patch('module.ClassName1') | 
|  | ... def test(MockClass1, MockClass2): | 
|  | ...     module.ClassName1() | 
|  | ...     module.ClassName2() | 
|  |  | 
|  | ...     assert MockClass1 is module.ClassName1 | 
|  | ...     assert MockClass2 is module.ClassName2 | 
|  | ...     assert MockClass1.called | 
|  | ...     assert MockClass2.called | 
|  | ... | 
|  | >>> test() | 
|  |  | 
|  | .. note:: | 
|  |  | 
|  | When you nest patch decorators the mocks are passed in to the decorated | 
|  | function in the same order they applied (the normal *python* order that | 
|  | decorators are applied). This means from the bottom up, so in the example | 
|  | above the mock for `module.ClassName1` is passed in first. | 
|  |  | 
|  | With `patch` it matters that you patch objects in the namespace where they | 
|  | are looked up. This is normally straightforward, but for a quick guide | 
|  | read :ref:`where to patch <where-to-patch>`. | 
|  |  | 
|  | As well as a decorator `patch` can be used as a context manager in a with | 
|  | statement: | 
|  |  | 
|  | .. doctest:: | 
|  |  | 
|  | >>> with patch.object(ProductionClass, 'method', return_value=None) as mock_method: | 
|  | ...     thing = ProductionClass() | 
|  | ...     thing.method(1, 2, 3) | 
|  | ... | 
|  | >>> mock_method.assert_called_once_with(1, 2, 3) | 
|  |  | 
|  |  | 
|  | There is also :func:`patch.dict` for setting values in a dictionary just | 
|  | during a scope and restoring the dictionary to its original state when the test | 
|  | ends: | 
|  |  | 
|  | .. doctest:: | 
|  |  | 
|  | >>> foo = {'key': 'value'} | 
|  | >>> original = foo.copy() | 
|  | >>> with patch.dict(foo, {'newkey': 'newvalue'}, clear=True): | 
|  | ...     assert foo == {'newkey': 'newvalue'} | 
|  | ... | 
|  | >>> assert foo == original | 
|  |  | 
|  | Mock supports the mocking of Python :ref:`magic methods <magic-methods>`. The | 
|  | easiest way of using magic methods is with the :class:`MagicMock` class. It | 
|  | allows you to do things like: | 
|  |  | 
|  | .. doctest:: | 
|  |  | 
|  | >>> mock = MagicMock() | 
|  | >>> mock.__str__.return_value = 'foobarbaz' | 
|  | >>> str(mock) | 
|  | 'foobarbaz' | 
|  | >>> mock.__str__.assert_called_with() | 
|  |  | 
|  | Mock allows you to assign functions (or other Mock instances) to magic methods | 
|  | and they will be called appropriately. The `MagicMock` class is just a Mock | 
|  | variant that has all of the magic methods pre-created for you (well, all the | 
|  | useful ones anyway). | 
|  |  | 
|  | The following is an example of using magic methods with the ordinary Mock | 
|  | class: | 
|  |  | 
|  | .. doctest:: | 
|  |  | 
|  | >>> mock = Mock() | 
|  | >>> mock.__str__ = Mock(return_value='wheeeeee') | 
|  | >>> str(mock) | 
|  | 'wheeeeee' | 
|  |  | 
|  | For ensuring that the mock objects in your tests have the same api as the | 
|  | objects they are replacing, you can use :ref:`auto-speccing <auto-speccing>`. | 
|  | Auto-speccing can be done through the `autospec` argument to patch, or the | 
|  | :func:`create_autospec` function. Auto-speccing creates mock objects that | 
|  | have the same attributes and methods as the objects they are replacing, and | 
|  | any functions and methods (including constructors) have the same call | 
|  | signature as the real object. | 
|  |  | 
|  | This ensures that your mocks will fail in the same way as your production | 
|  | code if they are used incorrectly: | 
|  |  | 
|  | .. doctest:: | 
|  |  | 
|  | >>> from mock import create_autospec | 
|  | >>> def function(a, b, c): | 
|  | ...     pass | 
|  | ... | 
|  | >>> mock_function = create_autospec(function, return_value='fishy') | 
|  | >>> mock_function(1, 2, 3) | 
|  | 'fishy' | 
|  | >>> mock_function.assert_called_once_with(1, 2, 3) | 
|  | >>> mock_function('wrong arguments') | 
|  | Traceback (most recent call last): | 
|  | ... | 
|  | TypeError: <lambda>() takes exactly 3 arguments (1 given) | 
|  |  | 
|  | `create_autospec` can also be used on classes, where it copies the signature of | 
|  | the `__init__` method, and on callable objects where it copies the signature of | 
|  | the `__call__` method. | 
|  |  | 
|  |  | 
|  | .. index:: references | 
|  | .. index:: articles | 
|  |  | 
|  | References | 
|  | ========== | 
|  |  | 
|  | Articles, blog entries and other stuff related to testing with Mock: | 
|  |  | 
|  | * `Imposing a No DB Discipline on Django unit tests | 
|  | <https://github.com/carljm/django-testing-slides/blob/master/models/30_no_database.md>`_ | 
|  | * `mock-django: tools for mocking the Django ORM and models | 
|  | <https://github.com/dcramer/mock-django>`_ | 
|  | * `PyCon 2011 Video: Testing with mock <https://blip.tv/file/4881513>`_ | 
|  | * `Mock objects in Python | 
|  | <http://noopenblockers.com/2012/01/06/mock-objects-in-python/>`_ | 
|  | * `Python: Injecting Mock Objects for Powerful Testing | 
|  | <http://blueprintforge.com/blog/2012/01/08/python-injecting-mock-objects-for-powerful-testing/>`_ | 
|  | * `Python Mock: How to assert a substring of logger output | 
|  | <http://www.michaelpollmeier.com/python-mock-how-to-assert-a-substring-of-logger-output/>`_ | 
|  | * `Mocking Django <http://www.mattjmorrison.com/2011/09/mocking-django.html>`_ | 
|  | * `Mocking dates and other classes that can't be modified | 
|  | <http://williamjohnbert.com/2011/07/how-to-unit-testing-in-django-with-mocking-and-patching/>`_ | 
|  | * `Mock recipes <http://konryd.blogspot.com/2010/06/mock-recipies.html>`_ | 
|  | * `Mockity mock mock - some love for the mock module | 
|  | <http://konryd.blogspot.com/2010/05/mockity-mock-mock-some-love-for-mock.html>`_ | 
|  | * `Coverage and Mock (with django) | 
|  | <http://mattsnider.com/python/mock-and-coverage/>`_ | 
|  | * `Python Unit Testing with Mock <http://www.insomnihack.com/?p=194>`_ | 
|  | * `Getting started with Python Mock | 
|  | <http://myadventuresincoding.wordpress.com/2011/02/26/python-python-mock-cheat-sheet/>`_ | 
|  | * `Smart Parameter Checks with mock | 
|  | <http://tobyho.com/2011/03/24/smart-parameter-checks-in/>`_ | 
|  | * `Python mock testing techniques and tools | 
|  | <http://agiletesting.blogspot.com/2009/07/python-mock-testing-techniques-and.html>`_ | 
|  | * `How To Test Django Template Tags | 
|  | <http://techblog.ironfroggy.com/2008/10/how-to-test.html>`_ | 
|  | * `A presentation on Unit Testing with Mock | 
|  | <http://pypap.blogspot.com/2008/10/newbie-nugget-unit-testing-with-mock.html>`_ | 
|  | * `Mocking with Django and Google AppEngine | 
|  | <http://michael-a-nelson.blogspot.com/2008/09/mocking-with-django-and-google-app.html>`_ | 
|  |  | 
|  |  | 
|  | .. index:: tests | 
|  | .. index:: unittest2 | 
|  |  | 
|  | Tests | 
|  | ===== | 
|  |  | 
|  | Mock uses `unittest2 <http://pypi.python.org/pypi/unittest2>`_ for its own | 
|  | test suite. In order to run it, use the `unit2` script that comes with | 
|  | `unittest2` module on a checkout of the source repository: | 
|  |  | 
|  | `unit2 discover` | 
|  |  | 
|  | If you have `setuptools <http://pypi.python.org/pypi/distribute>`_ as well as | 
|  | unittest2 you can run: | 
|  |  | 
|  | ``python setup.py test`` | 
|  |  | 
|  | On Python 3.2 you can use ``unittest`` module from the standard library. | 
|  |  | 
|  | ``python3.2 -m unittest discover`` | 
|  |  | 
|  | .. index:: Python 3 | 
|  |  | 
|  | On Python 3 the tests for unicode are skipped as they are not relevant. On | 
|  | Python 2.4 tests that use the with statements are skipped as the with statement | 
|  | is invalid syntax on Python 2.4. | 
|  |  | 
|  |  | 
|  | .. index:: older versions | 
|  |  | 
|  | Older Versions | 
|  | ============== | 
|  |  | 
|  | Documentation for older versions of mock: | 
|  |  | 
|  | * `mock 0.8 <http://www.voidspace.org.uk/python/mock/0.8/>`_ | 
|  | * `mock 0.7 <http://www.voidspace.org.uk/python/mock/0.7/>`_ | 
|  | * `mock 0.6 <http://www.voidspace.org.uk/python/mock/0.6.0/>`_ | 
|  |  | 
|  | Docs from the in-development version of `mock` can be found at | 
|  | `mock.readthedocs.org <http://mock.readthedocs.org>`_. | 
|  |  | 
|  |  | 
|  | Terminology | 
|  | =========== | 
|  |  | 
|  | Terminology for objects used to replace other ones can be confusing. Terms | 
|  | like double, fake, mock, stub, and spy are all used with varying meanings. | 
|  |  | 
|  | In `classic mock terminology | 
|  | <http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html>`_ | 
|  | :class:`mock.Mock` is a `spy <http://xunitpatterns.com/Test%20Spy.html>`_ that | 
|  | allows for *post-mortem* examination. This is what I call the "action -> | 
|  | assertion" [#]_ pattern of testing. | 
|  |  | 
|  | I'm not however a fan of this "statically typed mocking terminology" | 
|  | promulgated by `Martin Fowler | 
|  | <http://martinfowler.com/articles/mocksArentStubs.html>`_. It confuses usage | 
|  | patterns with implementation and prevents you from using natural terminology | 
|  | when discussing mocking. | 
|  |  | 
|  | I much prefer duck typing, if an object used in your test suite looks like a | 
|  | mock object and quacks like a mock object then it's fine to call it a mock, no | 
|  | matter what the implementation looks like. | 
|  |  | 
|  | This terminology is perhaps more useful in less capable languages where | 
|  | different usage patterns will *require* different implementations. | 
|  | `mock.Mock()` is capable of being used in most of the different roles | 
|  | described by Fowler, except (annoyingly / frustratingly / ironically) a Mock | 
|  | itself! | 
|  |  | 
|  | How about a simpler definition: a "mock object" is an object used to replace a | 
|  | real one in a system under test. | 
|  |  | 
|  | .. [#] This pattern is called "AAA" by some members of the testing community; | 
|  | "Arrange - Act - Assert". |