====================================
|
Mock - Mocking and Testing Library
|
====================================
|
|
:Version: |release|
|
:Date: |today|
|
:Homepage: `Mock Homepage`_
|
:Download: `Mock on PyPI`_
|
:Documentation: `Python Docs`_
|
:License: `BSD License`_
|
:Support: `Mailing list (testing-in-python@lists.idyll.org)
|
<http://lists.idyll.org/listinfo/testing-in-python>`_
|
:Issue tracker: `GitHub Issues
|
<https://github.com/testing-cabal/mock/issues>`_
|
:Last sync: cb6aab1248c4aec4dd578bea717854505a6fb55d
|
|
.. _Mock Homepage: https://github.com/testing-cabal/mock
|
.. _BSD License: http://github.com/testing-cabal/mock/blob/master/LICENSE.txt
|
.. _Python Docs: https://docs.python.org/dev/library/unittest.mock.html
|
|
.. module:: mock
|
:synopsis: Mock object and testing library.
|
|
.. index:: introduction
|
|
TOC
|
+++
|
|
.. toctree::
|
:maxdepth: 2
|
|
changelog
|
|
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`` in Python 3.3 onwards. However, if you are writing code that
|
runs on multiple versions of Python the ``mock`` package is better, as you get
|
the newest features from the latest release of Python available for all
|
Pythons.
|
|
The ``mock`` package contains a rolling backport of the standard library mock
|
code compatible with Python 2.7 and 3.3 and up.
|
|
* Python 2.6 is supported by mock 2.0.0 and below.
|
|
* Python 3.2 is supported by mock 1.3.0 and below - with pip no longer
|
supporting 3.2, we cannot test against that version anymore.
|
|
Please see the standard library documentation for usage details.
|
|
.. index:: installing
|
.. _installing:
|
|
Installing
|
++++++++++
|
|
The current version is |release|. Mock is stable and widely used.
|
|
* `mock on PyPI <http://pypi.python.org/pypi/mock>`_
|
|
.. index:: repository
|
.. index:: git
|
|
You can checkout the latest development version from GitHub
|
repository with the following command:
|
|
``git clone https://github.com/testing-cabal/mock``
|
|
|
.. index:: pip
|
|
You can install mock with pip:
|
|
| ``pip install -U mock``
|
|
Alternatively you can download the mock distribution from PyPI and after
|
unpacking run:
|
|
``python setup.py install``
|
|
|
.. index:: bug reports
|
|
Bug Reports
|
+++++++++++
|
|
Mock uses `unittest2 <http://pypi.python.org/pypi/unittest2>`_ for its own
|
Issues with the backport process, such as compatibility with a particular
|
Python, should be reported to the `bug tracker
|
<https://github.com/testing-cabal/mock/issues>`_. Feature requests and issues
|
with Mock functionality should be reported to the `Python bug tracker
|
<https://bugs.python.org>`_.
|
|
.. index:: python changes
|
|
Python Changes
|
++++++++++++++
|
|
Python NEWS entries from cPython:
|
|
.. include:: ../NEWS
|
|
.. index:: older versions
|
|
Older Versions of Python
|
++++++++++++++++++++++++
|
|
Version 1.0.1 is the last version compatible with Python < 2.6.
|
|
Version 2.0.0 is the last version compatible with Python 2.6.
|
|
.. index:: maintainer notes
|
|
Maintainer Notes
|
++++++++++++++++
|
|
Development
|
===========
|
|
Checkout from git (see :ref:`installing`) and submit pull requests.
|
|
Committers can just push as desired: since all semantic development takes
|
place in cPython, the backport process is as lightweight as we can make it.
|
|
mock is CI tested using Travis-CI on Python versions 2.7, 3.3, 3.4,
|
3.5, nightly Python 3 builds, pypy, pypy3. Jython support is desired, if
|
someone could contribute a patch to .travis.yml to support it that would be
|
excellent.
|
|
Releasing
|
=========
|
|
NB: please use semver. Bump the major component on API breaks, minor on all
|
non-bugfix changes, patch on bugfix only changes.
|
|
1. tag -s, push --tags origin master
|
2. setup.py sdist bdist_wheel upload -s
|
|
|
Backporting rules
|
=================
|
|
isinstance checks in cPython to ``type`` need to check ``ClassTypes``.
|
Code calling ``obj.isidentifier`` needs to change to ``_isidentifier(obj)``.
|
|
Backporting process
|
===================
|
|
1. Patch your git am with `my patch <https://github.com/rbtcollins/git>`_.
|
2. Install the applypatch-transform hook from tools/ to your .git hooks dir.
|
3. Configure a pre-applypatch hook to test at least all the cPython versions
|
we support on each patch that is applied. I use containers, and a sample
|
script is in tools/pre-applypatch.
|
4. Pull down the cPython git mirror: https://github.com/python/cpython.git
|
5. Export the new revisions since the ``Last sync`` at the top of this
|
document::
|
|
revs=${lastsync}
|
rm migrate-export
|
git log --pretty="format:%H " $revs.. -- Lib/unittest/mock.py \
|
Lib/unittest/test/testmock/ > migrate-revs
|
tac migrate-revs > migrate-sorted-revs
|
for rev in $(< migrate-sorted-revs); do
|
git format-patch -1 $rev -k --stdout >> migrate-export;
|
done
|
echo NEW SYNC POINT: $(git rev-parse HEAD)
|
|
6. Import into mock::
|
|
git am -k --reject $path-to-cpython/migrate-export
|
|
This will transform the patches automatically. Currently it will error
|
on every NEWS change as I haven't gotten around to making those patches
|
automatic. Fixup any errors that occur. When the patch is ready, do a ``git
|
add -u`` to update the index and then ``git am --continue`` to move onto
|
the next patch. If the patch is inappropriate e.g. the patch removing
|
__ne__ which would break older pythons, then either do ``git reset --hard;
|
git am --skip`` to discard any partially applied changes and skip over it,
|
or, if it has a NEWS entry thats worth preserving, edit it down to just
|
that, with a note such as we have for the ``__ne__`` patch, and continue on
|
from there.
|
|
The goal is that every patch work at all times.
|
|
7. After the import is complete, update this document with the new sync point.
|
|
8. Push to a personal branch and propose a PR to the main repo. This will make
|
Travis-CI test it. If it works, push to the main repo.
|