17db96d56Sopenharmony_ci
27db96d56Sopenharmony_ci:mod:`unittest.mock` --- mock object library
37db96d56Sopenharmony_ci============================================
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci.. module:: unittest.mock
67db96d56Sopenharmony_ci   :synopsis: Mock object library.
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci.. moduleauthor:: Michael Foord <michael@python.org>
97db96d56Sopenharmony_ci.. currentmodule:: unittest.mock
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci.. versionadded:: 3.3
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci**Source code:** :source:`Lib/unittest/mock.py`
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci--------------
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci:mod:`unittest.mock` is a library for testing in Python. It allows you to
187db96d56Sopenharmony_cireplace parts of your system under test with mock objects and make assertions
197db96d56Sopenharmony_ciabout how they have been used.
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci:mod:`unittest.mock` provides a core :class:`Mock` class removing the need to
227db96d56Sopenharmony_cicreate a host of stubs throughout your test suite. After performing an
237db96d56Sopenharmony_ciaction, you can make assertions about which methods / attributes were used
247db96d56Sopenharmony_ciand arguments they were called with. You can also specify return values and
257db96d56Sopenharmony_ciset needed attributes in the normal way.
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ciAdditionally, mock provides a :func:`patch` decorator that handles patching
287db96d56Sopenharmony_cimodule and class level attributes within the scope of a test, along with
297db96d56Sopenharmony_ci:const:`sentinel` for creating unique objects. See the `quick guide`_ for
307db96d56Sopenharmony_cisome examples of how to use :class:`Mock`, :class:`MagicMock` and
317db96d56Sopenharmony_ci:func:`patch`.
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ciMock is designed for use with :mod:`unittest` and
347db96d56Sopenharmony_ciis based on the 'action -> assertion' pattern instead of 'record -> replay'
357db96d56Sopenharmony_ciused by many mocking frameworks.
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ciThere is a backport of :mod:`unittest.mock` for earlier versions of Python,
387db96d56Sopenharmony_ciavailable as `mock on PyPI <https://pypi.org/project/mock>`_.
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ciQuick Guide
427db96d56Sopenharmony_ci-----------
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci.. testsetup::
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci    class ProductionClass:
477db96d56Sopenharmony_ci        def method(self, a, b, c):
487db96d56Sopenharmony_ci            pass
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci    class SomeClass:
517db96d56Sopenharmony_ci        @staticmethod
527db96d56Sopenharmony_ci        def static_method(args):
537db96d56Sopenharmony_ci            return args
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci        @classmethod
567db96d56Sopenharmony_ci        def class_method(cls, args):
577db96d56Sopenharmony_ci            return args
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci:class:`Mock` and :class:`MagicMock` objects create all attributes and
617db96d56Sopenharmony_cimethods as you access them and store details of how they have been used. You
627db96d56Sopenharmony_cican configure them, to specify return values or limit what attributes are
637db96d56Sopenharmony_ciavailable, and then make assertions about how they have been used:
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci    >>> from unittest.mock import MagicMock
667db96d56Sopenharmony_ci    >>> thing = ProductionClass()
677db96d56Sopenharmony_ci    >>> thing.method = MagicMock(return_value=3)
687db96d56Sopenharmony_ci    >>> thing.method(3, 4, 5, key='value')
697db96d56Sopenharmony_ci    3
707db96d56Sopenharmony_ci    >>> thing.method.assert_called_with(3, 4, 5, key='value')
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci:attr:`side_effect` allows you to perform side effects, including raising an
737db96d56Sopenharmony_ciexception when a mock is called:
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci   >>> mock = Mock(side_effect=KeyError('foo'))
767db96d56Sopenharmony_ci   >>> mock()
777db96d56Sopenharmony_ci   Traceback (most recent call last):
787db96d56Sopenharmony_ci    ...
797db96d56Sopenharmony_ci   KeyError: 'foo'
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci   >>> values = {'a': 1, 'b': 2, 'c': 3}
827db96d56Sopenharmony_ci   >>> def side_effect(arg):
837db96d56Sopenharmony_ci   ...     return values[arg]
847db96d56Sopenharmony_ci   ...
857db96d56Sopenharmony_ci   >>> mock.side_effect = side_effect
867db96d56Sopenharmony_ci   >>> mock('a'), mock('b'), mock('c')
877db96d56Sopenharmony_ci   (1, 2, 3)
887db96d56Sopenharmony_ci   >>> mock.side_effect = [5, 4, 3, 2, 1]
897db96d56Sopenharmony_ci   >>> mock(), mock(), mock()
907db96d56Sopenharmony_ci   (5, 4, 3)
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ciMock has many other ways you can configure it and control its behaviour. For
937db96d56Sopenharmony_ciexample the *spec* argument configures the mock to take its specification
947db96d56Sopenharmony_cifrom another object. Attempting to access attributes or methods on the mock
957db96d56Sopenharmony_cithat don't exist on the spec will fail with an :exc:`AttributeError`.
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ciThe :func:`patch` decorator / context manager makes it easy to mock classes or
987db96d56Sopenharmony_ciobjects in a module under test. The object you specify will be replaced with a
997db96d56Sopenharmony_cimock (or other object) during the test and restored when the test ends::
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci    >>> from unittest.mock import patch
1027db96d56Sopenharmony_ci    >>> @patch('module.ClassName2')
1037db96d56Sopenharmony_ci    ... @patch('module.ClassName1')
1047db96d56Sopenharmony_ci    ... def test(MockClass1, MockClass2):
1057db96d56Sopenharmony_ci    ...     module.ClassName1()
1067db96d56Sopenharmony_ci    ...     module.ClassName2()
1077db96d56Sopenharmony_ci    ...     assert MockClass1 is module.ClassName1
1087db96d56Sopenharmony_ci    ...     assert MockClass2 is module.ClassName2
1097db96d56Sopenharmony_ci    ...     assert MockClass1.called
1107db96d56Sopenharmony_ci    ...     assert MockClass2.called
1117db96d56Sopenharmony_ci    ...
1127db96d56Sopenharmony_ci    >>> test()
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci.. note::
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci   When you nest patch decorators the mocks are passed in to the decorated
1177db96d56Sopenharmony_ci   function in the same order they applied (the normal *Python* order that
1187db96d56Sopenharmony_ci   decorators are applied). This means from the bottom up, so in the example
1197db96d56Sopenharmony_ci   above the mock for ``module.ClassName1`` is passed in first.
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci   With :func:`patch` it matters that you patch objects in the namespace where they
1227db96d56Sopenharmony_ci   are looked up. This is normally straightforward, but for a quick guide
1237db96d56Sopenharmony_ci   read :ref:`where to patch <where-to-patch>`.
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ciAs well as a decorator :func:`patch` can be used as a context manager in a with
1267db96d56Sopenharmony_cistatement:
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci    >>> with patch.object(ProductionClass, 'method', return_value=None) as mock_method:
1297db96d56Sopenharmony_ci    ...     thing = ProductionClass()
1307db96d56Sopenharmony_ci    ...     thing.method(1, 2, 3)
1317db96d56Sopenharmony_ci    ...
1327db96d56Sopenharmony_ci    >>> mock_method.assert_called_once_with(1, 2, 3)
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ciThere is also :func:`patch.dict` for setting values in a dictionary just
1367db96d56Sopenharmony_ciduring a scope and restoring the dictionary to its original state when the test
1377db96d56Sopenharmony_ciends:
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci   >>> foo = {'key': 'value'}
1407db96d56Sopenharmony_ci   >>> original = foo.copy()
1417db96d56Sopenharmony_ci   >>> with patch.dict(foo, {'newkey': 'newvalue'}, clear=True):
1427db96d56Sopenharmony_ci   ...     assert foo == {'newkey': 'newvalue'}
1437db96d56Sopenharmony_ci   ...
1447db96d56Sopenharmony_ci   >>> assert foo == original
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ciMock supports the mocking of Python :ref:`magic methods <magic-methods>`. The
1477db96d56Sopenharmony_cieasiest way of using magic methods is with the :class:`MagicMock` class. It
1487db96d56Sopenharmony_ciallows you to do things like:
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci    >>> mock = MagicMock()
1517db96d56Sopenharmony_ci    >>> mock.__str__.return_value = 'foobarbaz'
1527db96d56Sopenharmony_ci    >>> str(mock)
1537db96d56Sopenharmony_ci    'foobarbaz'
1547db96d56Sopenharmony_ci    >>> mock.__str__.assert_called_with()
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ciMock allows you to assign functions (or other Mock instances) to magic methods
1577db96d56Sopenharmony_ciand they will be called appropriately. The :class:`MagicMock` class is just a Mock
1587db96d56Sopenharmony_civariant that has all of the magic methods pre-created for you (well, all the
1597db96d56Sopenharmony_ciuseful ones anyway).
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ciThe following is an example of using magic methods with the ordinary Mock
1627db96d56Sopenharmony_ciclass:
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci    >>> mock = Mock()
1657db96d56Sopenharmony_ci    >>> mock.__str__ = Mock(return_value='wheeeeee')
1667db96d56Sopenharmony_ci    >>> str(mock)
1677db96d56Sopenharmony_ci    'wheeeeee'
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ciFor ensuring that the mock objects in your tests have the same api as the
1707db96d56Sopenharmony_ciobjects they are replacing, you can use :ref:`auto-speccing <auto-speccing>`.
1717db96d56Sopenharmony_ciAuto-speccing can be done through the *autospec* argument to patch, or the
1727db96d56Sopenharmony_ci:func:`create_autospec` function. Auto-speccing creates mock objects that
1737db96d56Sopenharmony_cihave the same attributes and methods as the objects they are replacing, and
1747db96d56Sopenharmony_ciany functions and methods (including constructors) have the same call
1757db96d56Sopenharmony_cisignature as the real object.
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ciThis ensures that your mocks will fail in the same way as your production
1787db96d56Sopenharmony_cicode if they are used incorrectly:
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci   >>> from unittest.mock import create_autospec
1817db96d56Sopenharmony_ci   >>> def function(a, b, c):
1827db96d56Sopenharmony_ci   ...     pass
1837db96d56Sopenharmony_ci   ...
1847db96d56Sopenharmony_ci   >>> mock_function = create_autospec(function, return_value='fishy')
1857db96d56Sopenharmony_ci   >>> mock_function(1, 2, 3)
1867db96d56Sopenharmony_ci   'fishy'
1877db96d56Sopenharmony_ci   >>> mock_function.assert_called_once_with(1, 2, 3)
1887db96d56Sopenharmony_ci   >>> mock_function('wrong arguments')
1897db96d56Sopenharmony_ci   Traceback (most recent call last):
1907db96d56Sopenharmony_ci    ...
1917db96d56Sopenharmony_ci   TypeError: <lambda>() takes exactly 3 arguments (1 given)
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci:func:`create_autospec` can also be used on classes, where it copies the signature of
1947db96d56Sopenharmony_cithe ``__init__`` method, and on callable objects where it copies the signature of
1957db96d56Sopenharmony_cithe ``__call__`` method.
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ciThe Mock Class
2007db96d56Sopenharmony_ci--------------
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci.. testsetup::
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci    import asyncio
2057db96d56Sopenharmony_ci    import inspect
2067db96d56Sopenharmony_ci    import unittest
2077db96d56Sopenharmony_ci    from unittest.mock import sentinel, DEFAULT, ANY
2087db96d56Sopenharmony_ci    from unittest.mock import patch, call, Mock, MagicMock, PropertyMock, AsyncMock
2097db96d56Sopenharmony_ci    from unittest.mock import mock_open
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci:class:`Mock` is a flexible mock object intended to replace the use of stubs and
2127db96d56Sopenharmony_citest doubles throughout your code. Mocks are callable and create attributes as
2137db96d56Sopenharmony_cinew mocks when you access them [#]_. Accessing the same attribute will always
2147db96d56Sopenharmony_cireturn the same mock. Mocks record how you use them, allowing you to make
2157db96d56Sopenharmony_ciassertions about what your code has done to them.
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci:class:`MagicMock` is a subclass of :class:`Mock` with all the magic methods
2187db96d56Sopenharmony_cipre-created and ready to use. There are also non-callable variants, useful
2197db96d56Sopenharmony_ciwhen you are mocking out objects that aren't callable:
2207db96d56Sopenharmony_ci:class:`NonCallableMock` and :class:`NonCallableMagicMock`
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ciThe :func:`patch` decorators makes it easy to temporarily replace classes
2237db96d56Sopenharmony_ciin a particular module with a :class:`Mock` object. By default :func:`patch` will create
2247db96d56Sopenharmony_cia :class:`MagicMock` for you. You can specify an alternative class of :class:`Mock` using
2257db96d56Sopenharmony_cithe *new_callable* argument to :func:`patch`.
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci.. class:: Mock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs)
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci    Create a new :class:`Mock` object. :class:`Mock` takes several optional arguments
2317db96d56Sopenharmony_ci    that specify the behaviour of the Mock object:
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ci    * *spec*: This can be either a list of strings or an existing object (a
2347db96d56Sopenharmony_ci      class or instance) that acts as the specification for the mock object. If
2357db96d56Sopenharmony_ci      you pass in an object then a list of strings is formed by calling dir on
2367db96d56Sopenharmony_ci      the object (excluding unsupported magic attributes and methods).
2377db96d56Sopenharmony_ci      Accessing any attribute not in this list will raise an :exc:`AttributeError`.
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci      If *spec* is an object (rather than a list of strings) then
2407db96d56Sopenharmony_ci      :attr:`~instance.__class__` returns the class of the spec object. This
2417db96d56Sopenharmony_ci      allows mocks to pass :func:`isinstance` tests.
2427db96d56Sopenharmony_ci
2437db96d56Sopenharmony_ci    * *spec_set*: A stricter variant of *spec*. If used, attempting to *set*
2447db96d56Sopenharmony_ci      or get an attribute on the mock that isn't on the object passed as
2457db96d56Sopenharmony_ci      *spec_set* will raise an :exc:`AttributeError`.
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci    * *side_effect*: A function to be called whenever the Mock is called. See
2487db96d56Sopenharmony_ci      the :attr:`~Mock.side_effect` attribute. Useful for raising exceptions or
2497db96d56Sopenharmony_ci      dynamically changing return values. The function is called with the same
2507db96d56Sopenharmony_ci      arguments as the mock, and unless it returns :data:`DEFAULT`, the return
2517db96d56Sopenharmony_ci      value of this function is used as the return value.
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci      Alternatively *side_effect* can be an exception class or instance. In
2547db96d56Sopenharmony_ci      this case the exception will be raised when the mock is called.
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci      If *side_effect* is an iterable then each call to the mock will return
2577db96d56Sopenharmony_ci      the next value from the iterable.
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ci      A *side_effect* can be cleared by setting it to ``None``.
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci    * *return_value*: The value returned when the mock is called. By default
2627db96d56Sopenharmony_ci      this is a new Mock (created on first access). See the
2637db96d56Sopenharmony_ci      :attr:`return_value` attribute.
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci    * *unsafe*: By default, accessing any attribute whose name starts with
2667db96d56Sopenharmony_ci      *assert*, *assret*, *asert*, *aseert* or *assrt* will raise an
2677db96d56Sopenharmony_ci      :exc:`AttributeError`. Passing ``unsafe=True`` will allow access to
2687db96d56Sopenharmony_ci      these attributes.
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci      .. versionadded:: 3.5
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci    * *wraps*: Item for the mock object to wrap. If *wraps* is not ``None`` then
2737db96d56Sopenharmony_ci      calling the Mock will pass the call through to the wrapped object
2747db96d56Sopenharmony_ci      (returning the real result). Attribute access on the mock will return a
2757db96d56Sopenharmony_ci      Mock object that wraps the corresponding attribute of the wrapped
2767db96d56Sopenharmony_ci      object (so attempting to access an attribute that doesn't exist will
2777db96d56Sopenharmony_ci      raise an :exc:`AttributeError`).
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci      If the mock has an explicit *return_value* set then calls are not passed
2807db96d56Sopenharmony_ci      to the wrapped object and the *return_value* is returned instead.
2817db96d56Sopenharmony_ci
2827db96d56Sopenharmony_ci    * *name*: If the mock has a name then it will be used in the repr of the
2837db96d56Sopenharmony_ci      mock. This can be useful for debugging. The name is propagated to child
2847db96d56Sopenharmony_ci      mocks.
2857db96d56Sopenharmony_ci
2867db96d56Sopenharmony_ci    Mocks can also be called with arbitrary keyword arguments. These will be
2877db96d56Sopenharmony_ci    used to set attributes on the mock after it is created. See the
2887db96d56Sopenharmony_ci    :meth:`configure_mock` method for details.
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci    .. method:: assert_called()
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci        Assert that the mock was called at least once.
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci            >>> mock = Mock()
2957db96d56Sopenharmony_ci            >>> mock.method()
2967db96d56Sopenharmony_ci            <Mock name='mock.method()' id='...'>
2977db96d56Sopenharmony_ci            >>> mock.method.assert_called()
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci        .. versionadded:: 3.6
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci    .. method:: assert_called_once()
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ci        Assert that the mock was called exactly once.
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci            >>> mock = Mock()
3067db96d56Sopenharmony_ci            >>> mock.method()
3077db96d56Sopenharmony_ci            <Mock name='mock.method()' id='...'>
3087db96d56Sopenharmony_ci            >>> mock.method.assert_called_once()
3097db96d56Sopenharmony_ci            >>> mock.method()
3107db96d56Sopenharmony_ci            <Mock name='mock.method()' id='...'>
3117db96d56Sopenharmony_ci            >>> mock.method.assert_called_once()
3127db96d56Sopenharmony_ci            Traceback (most recent call last):
3137db96d56Sopenharmony_ci            ...
3147db96d56Sopenharmony_ci            AssertionError: Expected 'method' to have been called once. Called 2 times.
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci        .. versionadded:: 3.6
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci    .. method:: assert_called_with(*args, **kwargs)
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci        This method is a convenient way of asserting that the last call has been
3227db96d56Sopenharmony_ci        made in a particular way:
3237db96d56Sopenharmony_ci
3247db96d56Sopenharmony_ci            >>> mock = Mock()
3257db96d56Sopenharmony_ci            >>> mock.method(1, 2, 3, test='wow')
3267db96d56Sopenharmony_ci            <Mock name='mock.method()' id='...'>
3277db96d56Sopenharmony_ci            >>> mock.method.assert_called_with(1, 2, 3, test='wow')
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci    .. method:: assert_called_once_with(*args, **kwargs)
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci       Assert that the mock was called exactly once and that call was with the
3327db96d56Sopenharmony_ci       specified arguments.
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ci            >>> mock = Mock(return_value=None)
3357db96d56Sopenharmony_ci            >>> mock('foo', bar='baz')
3367db96d56Sopenharmony_ci            >>> mock.assert_called_once_with('foo', bar='baz')
3377db96d56Sopenharmony_ci            >>> mock('other', bar='values')
3387db96d56Sopenharmony_ci            >>> mock.assert_called_once_with('other', bar='values')
3397db96d56Sopenharmony_ci            Traceback (most recent call last):
3407db96d56Sopenharmony_ci              ...
3417db96d56Sopenharmony_ci            AssertionError: Expected 'mock' to be called once. Called 2 times.
3427db96d56Sopenharmony_ci
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci    .. method:: assert_any_call(*args, **kwargs)
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci        assert the mock has been called with the specified arguments.
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ci        The assert passes if the mock has *ever* been called, unlike
3497db96d56Sopenharmony_ci        :meth:`assert_called_with` and :meth:`assert_called_once_with` that
3507db96d56Sopenharmony_ci        only pass if the call is the most recent one, and in the case of
3517db96d56Sopenharmony_ci        :meth:`assert_called_once_with` it must also be the only call.
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci            >>> mock = Mock(return_value=None)
3547db96d56Sopenharmony_ci            >>> mock(1, 2, arg='thing')
3557db96d56Sopenharmony_ci            >>> mock('some', 'thing', 'else')
3567db96d56Sopenharmony_ci            >>> mock.assert_any_call(1, 2, arg='thing')
3577db96d56Sopenharmony_ci
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci    .. method:: assert_has_calls(calls, any_order=False)
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ci        assert the mock has been called with the specified calls.
3627db96d56Sopenharmony_ci        The :attr:`mock_calls` list is checked for the calls.
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci        If *any_order* is false then the calls must be
3657db96d56Sopenharmony_ci        sequential. There can be extra calls before or after the
3667db96d56Sopenharmony_ci        specified calls.
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ci        If *any_order* is true then the calls can be in any order, but
3697db96d56Sopenharmony_ci        they must all appear in :attr:`mock_calls`.
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_ci            >>> mock = Mock(return_value=None)
3727db96d56Sopenharmony_ci            >>> mock(1)
3737db96d56Sopenharmony_ci            >>> mock(2)
3747db96d56Sopenharmony_ci            >>> mock(3)
3757db96d56Sopenharmony_ci            >>> mock(4)
3767db96d56Sopenharmony_ci            >>> calls = [call(2), call(3)]
3777db96d56Sopenharmony_ci            >>> mock.assert_has_calls(calls)
3787db96d56Sopenharmony_ci            >>> calls = [call(4), call(2), call(3)]
3797db96d56Sopenharmony_ci            >>> mock.assert_has_calls(calls, any_order=True)
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ci    .. method:: assert_not_called()
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci        Assert the mock was never called.
3847db96d56Sopenharmony_ci
3857db96d56Sopenharmony_ci            >>> m = Mock()
3867db96d56Sopenharmony_ci            >>> m.hello.assert_not_called()
3877db96d56Sopenharmony_ci            >>> obj = m.hello()
3887db96d56Sopenharmony_ci            >>> m.hello.assert_not_called()
3897db96d56Sopenharmony_ci            Traceback (most recent call last):
3907db96d56Sopenharmony_ci              ...
3917db96d56Sopenharmony_ci            AssertionError: Expected 'hello' to not have been called. Called 1 times.
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci        .. versionadded:: 3.5
3947db96d56Sopenharmony_ci
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ci    .. method:: reset_mock(*, return_value=False, side_effect=False)
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ci        The reset_mock method resets all the call attributes on a mock object:
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ci            >>> mock = Mock(return_value=None)
4017db96d56Sopenharmony_ci            >>> mock('hello')
4027db96d56Sopenharmony_ci            >>> mock.called
4037db96d56Sopenharmony_ci            True
4047db96d56Sopenharmony_ci            >>> mock.reset_mock()
4057db96d56Sopenharmony_ci            >>> mock.called
4067db96d56Sopenharmony_ci            False
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci        .. versionchanged:: 3.6
4097db96d56Sopenharmony_ci           Added two keyword-only arguments to the reset_mock function.
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_ci        This can be useful where you want to make a series of assertions that
4127db96d56Sopenharmony_ci        reuse the same object. Note that :meth:`reset_mock` *doesn't* clear the
4137db96d56Sopenharmony_ci        return value, :attr:`side_effect` or any child attributes you have
4147db96d56Sopenharmony_ci        set using normal assignment by default. In case you want to reset
4157db96d56Sopenharmony_ci        *return_value* or :attr:`side_effect`, then pass the corresponding
4167db96d56Sopenharmony_ci        parameter as ``True``. Child mocks and the return value mock
4177db96d56Sopenharmony_ci        (if any) are reset as well.
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci        .. note:: *return_value*, and :attr:`side_effect` are keyword-only
4207db96d56Sopenharmony_ci                  arguments.
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci    .. method:: mock_add_spec(spec, spec_set=False)
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci        Add a spec to a mock. *spec* can either be an object or a
4267db96d56Sopenharmony_ci        list of strings. Only attributes on the *spec* can be fetched as
4277db96d56Sopenharmony_ci        attributes from the mock.
4287db96d56Sopenharmony_ci
4297db96d56Sopenharmony_ci        If *spec_set* is true then only attributes on the spec can be set.
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci    .. method:: attach_mock(mock, attribute)
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci        Attach a mock as an attribute of this one, replacing its name and
4357db96d56Sopenharmony_ci        parent. Calls to the attached mock will be recorded in the
4367db96d56Sopenharmony_ci        :attr:`method_calls` and :attr:`mock_calls` attributes of this one.
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci    .. method:: configure_mock(**kwargs)
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ci        Set attributes on the mock through keyword arguments.
4427db96d56Sopenharmony_ci
4437db96d56Sopenharmony_ci        Attributes plus return values and side effects can be set on child
4447db96d56Sopenharmony_ci        mocks using standard dot notation and unpacking a dictionary in the
4457db96d56Sopenharmony_ci        method call:
4467db96d56Sopenharmony_ci
4477db96d56Sopenharmony_ci            >>> mock = Mock()
4487db96d56Sopenharmony_ci            >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
4497db96d56Sopenharmony_ci            >>> mock.configure_mock(**attrs)
4507db96d56Sopenharmony_ci            >>> mock.method()
4517db96d56Sopenharmony_ci            3
4527db96d56Sopenharmony_ci            >>> mock.other()
4537db96d56Sopenharmony_ci            Traceback (most recent call last):
4547db96d56Sopenharmony_ci              ...
4557db96d56Sopenharmony_ci            KeyError
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci        The same thing can be achieved in the constructor call to mocks:
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci            >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
4607db96d56Sopenharmony_ci            >>> mock = Mock(some_attribute='eggs', **attrs)
4617db96d56Sopenharmony_ci            >>> mock.some_attribute
4627db96d56Sopenharmony_ci            'eggs'
4637db96d56Sopenharmony_ci            >>> mock.method()
4647db96d56Sopenharmony_ci            3
4657db96d56Sopenharmony_ci            >>> mock.other()
4667db96d56Sopenharmony_ci            Traceback (most recent call last):
4677db96d56Sopenharmony_ci              ...
4687db96d56Sopenharmony_ci            KeyError
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci        :meth:`configure_mock` exists to make it easier to do configuration
4717db96d56Sopenharmony_ci        after the mock has been created.
4727db96d56Sopenharmony_ci
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ci    .. method:: __dir__()
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci        :class:`Mock` objects limit the results of ``dir(some_mock)`` to useful results.
4777db96d56Sopenharmony_ci        For mocks with a *spec* this includes all the permitted attributes
4787db96d56Sopenharmony_ci        for the mock.
4797db96d56Sopenharmony_ci
4807db96d56Sopenharmony_ci        See :data:`FILTER_DIR` for what this filtering does, and how to
4817db96d56Sopenharmony_ci        switch it off.
4827db96d56Sopenharmony_ci
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci    .. method:: _get_child_mock(**kw)
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci        Create the child mocks for attributes and return value.
4877db96d56Sopenharmony_ci        By default child mocks will be the same type as the parent.
4887db96d56Sopenharmony_ci        Subclasses of Mock may want to override this to customize the way
4897db96d56Sopenharmony_ci        child mocks are made.
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci        For non-callable mocks the callable variant will be used (rather than
4927db96d56Sopenharmony_ci        any custom subclass).
4937db96d56Sopenharmony_ci
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci    .. attribute:: called
4967db96d56Sopenharmony_ci
4977db96d56Sopenharmony_ci        A boolean representing whether or not the mock object has been called:
4987db96d56Sopenharmony_ci
4997db96d56Sopenharmony_ci            >>> mock = Mock(return_value=None)
5007db96d56Sopenharmony_ci            >>> mock.called
5017db96d56Sopenharmony_ci            False
5027db96d56Sopenharmony_ci            >>> mock()
5037db96d56Sopenharmony_ci            >>> mock.called
5047db96d56Sopenharmony_ci            True
5057db96d56Sopenharmony_ci
5067db96d56Sopenharmony_ci    .. attribute:: call_count
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ci        An integer telling you how many times the mock object has been called:
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci            >>> mock = Mock(return_value=None)
5117db96d56Sopenharmony_ci            >>> mock.call_count
5127db96d56Sopenharmony_ci            0
5137db96d56Sopenharmony_ci            >>> mock()
5147db96d56Sopenharmony_ci            >>> mock()
5157db96d56Sopenharmony_ci            >>> mock.call_count
5167db96d56Sopenharmony_ci            2
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ci    .. attribute:: return_value
5197db96d56Sopenharmony_ci
5207db96d56Sopenharmony_ci        Set this to configure the value returned by calling the mock:
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci            >>> mock = Mock()
5237db96d56Sopenharmony_ci            >>> mock.return_value = 'fish'
5247db96d56Sopenharmony_ci            >>> mock()
5257db96d56Sopenharmony_ci            'fish'
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ci        The default return value is a mock object and you can configure it in
5287db96d56Sopenharmony_ci        the normal way:
5297db96d56Sopenharmony_ci
5307db96d56Sopenharmony_ci            >>> mock = Mock()
5317db96d56Sopenharmony_ci            >>> mock.return_value.attribute = sentinel.Attribute
5327db96d56Sopenharmony_ci            >>> mock.return_value()
5337db96d56Sopenharmony_ci            <Mock name='mock()()' id='...'>
5347db96d56Sopenharmony_ci            >>> mock.return_value.assert_called_with()
5357db96d56Sopenharmony_ci
5367db96d56Sopenharmony_ci        :attr:`return_value` can also be set in the constructor:
5377db96d56Sopenharmony_ci
5387db96d56Sopenharmony_ci            >>> mock = Mock(return_value=3)
5397db96d56Sopenharmony_ci            >>> mock.return_value
5407db96d56Sopenharmony_ci            3
5417db96d56Sopenharmony_ci            >>> mock()
5427db96d56Sopenharmony_ci            3
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci
5457db96d56Sopenharmony_ci    .. attribute:: side_effect
5467db96d56Sopenharmony_ci
5477db96d56Sopenharmony_ci        This can either be a function to be called when the mock is called,
5487db96d56Sopenharmony_ci        an iterable or an exception (class or instance) to be raised.
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci        If you pass in a function it will be called with same arguments as the
5517db96d56Sopenharmony_ci        mock and unless the function returns the :data:`DEFAULT` singleton the
5527db96d56Sopenharmony_ci        call to the mock will then return whatever the function returns. If the
5537db96d56Sopenharmony_ci        function returns :data:`DEFAULT` then the mock will return its normal
5547db96d56Sopenharmony_ci        value (from the :attr:`return_value`).
5557db96d56Sopenharmony_ci
5567db96d56Sopenharmony_ci        If you pass in an iterable, it is used to retrieve an iterator which
5577db96d56Sopenharmony_ci        must yield a value on every call.  This value can either be an exception
5587db96d56Sopenharmony_ci        instance to be raised, or a value to be returned from the call to the
5597db96d56Sopenharmony_ci        mock (:data:`DEFAULT` handling is identical to the function case).
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci        An example of a mock that raises an exception (to test exception
5627db96d56Sopenharmony_ci        handling of an API):
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci            >>> mock = Mock()
5657db96d56Sopenharmony_ci            >>> mock.side_effect = Exception('Boom!')
5667db96d56Sopenharmony_ci            >>> mock()
5677db96d56Sopenharmony_ci            Traceback (most recent call last):
5687db96d56Sopenharmony_ci              ...
5697db96d56Sopenharmony_ci            Exception: Boom!
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci        Using :attr:`side_effect` to return a sequence of values:
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci            >>> mock = Mock()
5747db96d56Sopenharmony_ci            >>> mock.side_effect = [3, 2, 1]
5757db96d56Sopenharmony_ci            >>> mock(), mock(), mock()
5767db96d56Sopenharmony_ci            (3, 2, 1)
5777db96d56Sopenharmony_ci
5787db96d56Sopenharmony_ci        Using a callable:
5797db96d56Sopenharmony_ci
5807db96d56Sopenharmony_ci            >>> mock = Mock(return_value=3)
5817db96d56Sopenharmony_ci            >>> def side_effect(*args, **kwargs):
5827db96d56Sopenharmony_ci            ...     return DEFAULT
5837db96d56Sopenharmony_ci            ...
5847db96d56Sopenharmony_ci            >>> mock.side_effect = side_effect
5857db96d56Sopenharmony_ci            >>> mock()
5867db96d56Sopenharmony_ci            3
5877db96d56Sopenharmony_ci
5887db96d56Sopenharmony_ci        :attr:`side_effect` can be set in the constructor. Here's an example that
5897db96d56Sopenharmony_ci        adds one to the value the mock is called with and returns it:
5907db96d56Sopenharmony_ci
5917db96d56Sopenharmony_ci            >>> side_effect = lambda value: value + 1
5927db96d56Sopenharmony_ci            >>> mock = Mock(side_effect=side_effect)
5937db96d56Sopenharmony_ci            >>> mock(3)
5947db96d56Sopenharmony_ci            4
5957db96d56Sopenharmony_ci            >>> mock(-8)
5967db96d56Sopenharmony_ci            -7
5977db96d56Sopenharmony_ci
5987db96d56Sopenharmony_ci        Setting :attr:`side_effect` to ``None`` clears it:
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ci            >>> m = Mock(side_effect=KeyError, return_value=3)
6017db96d56Sopenharmony_ci            >>> m()
6027db96d56Sopenharmony_ci            Traceback (most recent call last):
6037db96d56Sopenharmony_ci             ...
6047db96d56Sopenharmony_ci            KeyError
6057db96d56Sopenharmony_ci            >>> m.side_effect = None
6067db96d56Sopenharmony_ci            >>> m()
6077db96d56Sopenharmony_ci            3
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci
6107db96d56Sopenharmony_ci    .. attribute:: call_args
6117db96d56Sopenharmony_ci
6127db96d56Sopenharmony_ci        This is either ``None`` (if the mock hasn't been called), or the
6137db96d56Sopenharmony_ci        arguments that the mock was last called with. This will be in the
6147db96d56Sopenharmony_ci        form of a tuple: the first member, which can also be accessed through
6157db96d56Sopenharmony_ci        the ``args`` property, is any ordered arguments the mock was
6167db96d56Sopenharmony_ci        called with (or an empty tuple) and the second member, which can
6177db96d56Sopenharmony_ci        also be accessed through the ``kwargs`` property, is any keyword
6187db96d56Sopenharmony_ci        arguments (or an empty dictionary).
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_ci            >>> mock = Mock(return_value=None)
6217db96d56Sopenharmony_ci            >>> print(mock.call_args)
6227db96d56Sopenharmony_ci            None
6237db96d56Sopenharmony_ci            >>> mock()
6247db96d56Sopenharmony_ci            >>> mock.call_args
6257db96d56Sopenharmony_ci            call()
6267db96d56Sopenharmony_ci            >>> mock.call_args == ()
6277db96d56Sopenharmony_ci            True
6287db96d56Sopenharmony_ci            >>> mock(3, 4)
6297db96d56Sopenharmony_ci            >>> mock.call_args
6307db96d56Sopenharmony_ci            call(3, 4)
6317db96d56Sopenharmony_ci            >>> mock.call_args == ((3, 4),)
6327db96d56Sopenharmony_ci            True
6337db96d56Sopenharmony_ci            >>> mock.call_args.args
6347db96d56Sopenharmony_ci            (3, 4)
6357db96d56Sopenharmony_ci            >>> mock.call_args.kwargs
6367db96d56Sopenharmony_ci            {}
6377db96d56Sopenharmony_ci            >>> mock(3, 4, 5, key='fish', next='w00t!')
6387db96d56Sopenharmony_ci            >>> mock.call_args
6397db96d56Sopenharmony_ci            call(3, 4, 5, key='fish', next='w00t!')
6407db96d56Sopenharmony_ci            >>> mock.call_args.args
6417db96d56Sopenharmony_ci            (3, 4, 5)
6427db96d56Sopenharmony_ci            >>> mock.call_args.kwargs
6437db96d56Sopenharmony_ci            {'key': 'fish', 'next': 'w00t!'}
6447db96d56Sopenharmony_ci
6457db96d56Sopenharmony_ci        :attr:`call_args`, along with members of the lists :attr:`call_args_list`,
6467db96d56Sopenharmony_ci        :attr:`method_calls` and :attr:`mock_calls` are :data:`call` objects.
6477db96d56Sopenharmony_ci        These are tuples, so they can be unpacked to get at the individual
6487db96d56Sopenharmony_ci        arguments and make more complex assertions. See
6497db96d56Sopenharmony_ci        :ref:`calls as tuples <calls-as-tuples>`.
6507db96d56Sopenharmony_ci
6517db96d56Sopenharmony_ci        .. versionchanged:: 3.8
6527db96d56Sopenharmony_ci           Added ``args`` and ``kwargs`` properties.
6537db96d56Sopenharmony_ci
6547db96d56Sopenharmony_ci
6557db96d56Sopenharmony_ci    .. attribute:: call_args_list
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ci        This is a list of all the calls made to the mock object in sequence
6587db96d56Sopenharmony_ci        (so the length of the list is the number of times it has been
6597db96d56Sopenharmony_ci        called). Before any calls have been made it is an empty list. The
6607db96d56Sopenharmony_ci        :data:`call` object can be used for conveniently constructing lists of
6617db96d56Sopenharmony_ci        calls to compare with :attr:`call_args_list`.
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ci            >>> mock = Mock(return_value=None)
6647db96d56Sopenharmony_ci            >>> mock()
6657db96d56Sopenharmony_ci            >>> mock(3, 4)
6667db96d56Sopenharmony_ci            >>> mock(key='fish', next='w00t!')
6677db96d56Sopenharmony_ci            >>> mock.call_args_list
6687db96d56Sopenharmony_ci            [call(), call(3, 4), call(key='fish', next='w00t!')]
6697db96d56Sopenharmony_ci            >>> expected = [(), ((3, 4),), ({'key': 'fish', 'next': 'w00t!'},)]
6707db96d56Sopenharmony_ci            >>> mock.call_args_list == expected
6717db96d56Sopenharmony_ci            True
6727db96d56Sopenharmony_ci
6737db96d56Sopenharmony_ci        Members of :attr:`call_args_list` are :data:`call` objects. These can be
6747db96d56Sopenharmony_ci        unpacked as tuples to get at the individual arguments. See
6757db96d56Sopenharmony_ci        :ref:`calls as tuples <calls-as-tuples>`.
6767db96d56Sopenharmony_ci
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ci    .. attribute:: method_calls
6797db96d56Sopenharmony_ci
6807db96d56Sopenharmony_ci        As well as tracking calls to themselves, mocks also track calls to
6817db96d56Sopenharmony_ci        methods and attributes, and *their* methods and attributes:
6827db96d56Sopenharmony_ci
6837db96d56Sopenharmony_ci            >>> mock = Mock()
6847db96d56Sopenharmony_ci            >>> mock.method()
6857db96d56Sopenharmony_ci            <Mock name='mock.method()' id='...'>
6867db96d56Sopenharmony_ci            >>> mock.property.method.attribute()
6877db96d56Sopenharmony_ci            <Mock name='mock.property.method.attribute()' id='...'>
6887db96d56Sopenharmony_ci            >>> mock.method_calls
6897db96d56Sopenharmony_ci            [call.method(), call.property.method.attribute()]
6907db96d56Sopenharmony_ci
6917db96d56Sopenharmony_ci        Members of :attr:`method_calls` are :data:`call` objects. These can be
6927db96d56Sopenharmony_ci        unpacked as tuples to get at the individual arguments. See
6937db96d56Sopenharmony_ci        :ref:`calls as tuples <calls-as-tuples>`.
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_ci
6967db96d56Sopenharmony_ci    .. attribute:: mock_calls
6977db96d56Sopenharmony_ci
6987db96d56Sopenharmony_ci        :attr:`mock_calls` records *all* calls to the mock object, its methods,
6997db96d56Sopenharmony_ci        magic methods *and* return value mocks.
7007db96d56Sopenharmony_ci
7017db96d56Sopenharmony_ci            >>> mock = MagicMock()
7027db96d56Sopenharmony_ci            >>> result = mock(1, 2, 3)
7037db96d56Sopenharmony_ci            >>> mock.first(a=3)
7047db96d56Sopenharmony_ci            <MagicMock name='mock.first()' id='...'>
7057db96d56Sopenharmony_ci            >>> mock.second()
7067db96d56Sopenharmony_ci            <MagicMock name='mock.second()' id='...'>
7077db96d56Sopenharmony_ci            >>> int(mock)
7087db96d56Sopenharmony_ci            1
7097db96d56Sopenharmony_ci            >>> result(1)
7107db96d56Sopenharmony_ci            <MagicMock name='mock()()' id='...'>
7117db96d56Sopenharmony_ci            >>> expected = [call(1, 2, 3), call.first(a=3), call.second(),
7127db96d56Sopenharmony_ci            ... call.__int__(), call()(1)]
7137db96d56Sopenharmony_ci            >>> mock.mock_calls == expected
7147db96d56Sopenharmony_ci            True
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci        Members of :attr:`mock_calls` are :data:`call` objects. These can be
7177db96d56Sopenharmony_ci        unpacked as tuples to get at the individual arguments. See
7187db96d56Sopenharmony_ci        :ref:`calls as tuples <calls-as-tuples>`.
7197db96d56Sopenharmony_ci
7207db96d56Sopenharmony_ci        .. note::
7217db96d56Sopenharmony_ci
7227db96d56Sopenharmony_ci            The way :attr:`mock_calls` are recorded means that where nested
7237db96d56Sopenharmony_ci            calls are made, the parameters of ancestor calls are not recorded
7247db96d56Sopenharmony_ci            and so will always compare equal:
7257db96d56Sopenharmony_ci
7267db96d56Sopenharmony_ci                >>> mock = MagicMock()
7277db96d56Sopenharmony_ci                >>> mock.top(a=3).bottom()
7287db96d56Sopenharmony_ci                <MagicMock name='mock.top().bottom()' id='...'>
7297db96d56Sopenharmony_ci                >>> mock.mock_calls
7307db96d56Sopenharmony_ci                [call.top(a=3), call.top().bottom()]
7317db96d56Sopenharmony_ci                >>> mock.mock_calls[-1] == call.top(a=-1).bottom()
7327db96d56Sopenharmony_ci                True
7337db96d56Sopenharmony_ci
7347db96d56Sopenharmony_ci    .. attribute:: __class__
7357db96d56Sopenharmony_ci
7367db96d56Sopenharmony_ci        Normally the :attr:`__class__` attribute of an object will return its type.
7377db96d56Sopenharmony_ci        For a mock object with a :attr:`spec`, ``__class__`` returns the spec class
7387db96d56Sopenharmony_ci        instead. This allows mock objects to pass :func:`isinstance` tests for the
7397db96d56Sopenharmony_ci        object they are replacing / masquerading as:
7407db96d56Sopenharmony_ci
7417db96d56Sopenharmony_ci            >>> mock = Mock(spec=3)
7427db96d56Sopenharmony_ci            >>> isinstance(mock, int)
7437db96d56Sopenharmony_ci            True
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ci        :attr:`__class__` is assignable to, this allows a mock to pass an
7467db96d56Sopenharmony_ci        :func:`isinstance` check without forcing you to use a spec:
7477db96d56Sopenharmony_ci
7487db96d56Sopenharmony_ci            >>> mock = Mock()
7497db96d56Sopenharmony_ci            >>> mock.__class__ = dict
7507db96d56Sopenharmony_ci            >>> isinstance(mock, dict)
7517db96d56Sopenharmony_ci            True
7527db96d56Sopenharmony_ci
7537db96d56Sopenharmony_ci.. class:: NonCallableMock(spec=None, wraps=None, name=None, spec_set=None, **kwargs)
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ci    A non-callable version of :class:`Mock`. The constructor parameters have the same
7567db96d56Sopenharmony_ci    meaning of :class:`Mock`, with the exception of *return_value* and *side_effect*
7577db96d56Sopenharmony_ci    which have no meaning on a non-callable mock.
7587db96d56Sopenharmony_ci
7597db96d56Sopenharmony_ciMock objects that use a class or an instance as a :attr:`spec` or
7607db96d56Sopenharmony_ci:attr:`spec_set` are able to pass :func:`isinstance` tests:
7617db96d56Sopenharmony_ci
7627db96d56Sopenharmony_ci    >>> mock = Mock(spec=SomeClass)
7637db96d56Sopenharmony_ci    >>> isinstance(mock, SomeClass)
7647db96d56Sopenharmony_ci    True
7657db96d56Sopenharmony_ci    >>> mock = Mock(spec_set=SomeClass())
7667db96d56Sopenharmony_ci    >>> isinstance(mock, SomeClass)
7677db96d56Sopenharmony_ci    True
7687db96d56Sopenharmony_ci
7697db96d56Sopenharmony_ciThe :class:`Mock` classes have support for mocking magic methods. See :ref:`magic
7707db96d56Sopenharmony_cimethods <magic-methods>` for the full details.
7717db96d56Sopenharmony_ci
7727db96d56Sopenharmony_ciThe mock classes and the :func:`patch` decorators all take arbitrary keyword
7737db96d56Sopenharmony_ciarguments for configuration. For the :func:`patch` decorators the keywords are
7747db96d56Sopenharmony_cipassed to the constructor of the mock being created. The keyword arguments
7757db96d56Sopenharmony_ciare for configuring attributes of the mock:
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci        >>> m = MagicMock(attribute=3, other='fish')
7787db96d56Sopenharmony_ci        >>> m.attribute
7797db96d56Sopenharmony_ci        3
7807db96d56Sopenharmony_ci        >>> m.other
7817db96d56Sopenharmony_ci        'fish'
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_ciThe return value and side effect of child mocks can be set in the same way,
7847db96d56Sopenharmony_ciusing dotted notation. As you can't use dotted names directly in a call you
7857db96d56Sopenharmony_cihave to create a dictionary and unpack it using ``**``:
7867db96d56Sopenharmony_ci
7877db96d56Sopenharmony_ci    >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
7887db96d56Sopenharmony_ci    >>> mock = Mock(some_attribute='eggs', **attrs)
7897db96d56Sopenharmony_ci    >>> mock.some_attribute
7907db96d56Sopenharmony_ci    'eggs'
7917db96d56Sopenharmony_ci    >>> mock.method()
7927db96d56Sopenharmony_ci    3
7937db96d56Sopenharmony_ci    >>> mock.other()
7947db96d56Sopenharmony_ci    Traceback (most recent call last):
7957db96d56Sopenharmony_ci      ...
7967db96d56Sopenharmony_ci    KeyError
7977db96d56Sopenharmony_ci
7987db96d56Sopenharmony_ciA callable mock which was created with a *spec* (or a *spec_set*) will
7997db96d56Sopenharmony_ciintrospect the specification object's signature when matching calls to
8007db96d56Sopenharmony_cithe mock.  Therefore, it can match the actual call's arguments regardless
8017db96d56Sopenharmony_ciof whether they were passed positionally or by name::
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ci   >>> def f(a, b, c): pass
8047db96d56Sopenharmony_ci   ...
8057db96d56Sopenharmony_ci   >>> mock = Mock(spec=f)
8067db96d56Sopenharmony_ci   >>> mock(1, 2, c=3)
8077db96d56Sopenharmony_ci   <Mock name='mock()' id='140161580456576'>
8087db96d56Sopenharmony_ci   >>> mock.assert_called_with(1, 2, 3)
8097db96d56Sopenharmony_ci   >>> mock.assert_called_with(a=1, b=2, c=3)
8107db96d56Sopenharmony_ci
8117db96d56Sopenharmony_ciThis applies to :meth:`~Mock.assert_called_with`,
8127db96d56Sopenharmony_ci:meth:`~Mock.assert_called_once_with`, :meth:`~Mock.assert_has_calls` and
8137db96d56Sopenharmony_ci:meth:`~Mock.assert_any_call`.  When :ref:`auto-speccing`, it will also
8147db96d56Sopenharmony_ciapply to method calls on the mock object.
8157db96d56Sopenharmony_ci
8167db96d56Sopenharmony_ci   .. versionchanged:: 3.4
8177db96d56Sopenharmony_ci      Added signature introspection on specced and autospecced mock objects.
8187db96d56Sopenharmony_ci
8197db96d56Sopenharmony_ci
8207db96d56Sopenharmony_ci.. class:: PropertyMock(*args, **kwargs)
8217db96d56Sopenharmony_ci
8227db96d56Sopenharmony_ci   A mock intended to be used as a property, or other descriptor, on a class.
8237db96d56Sopenharmony_ci   :class:`PropertyMock` provides :meth:`__get__` and :meth:`__set__` methods
8247db96d56Sopenharmony_ci   so you can specify a return value when it is fetched.
8257db96d56Sopenharmony_ci
8267db96d56Sopenharmony_ci   Fetching a :class:`PropertyMock` instance from an object calls the mock, with
8277db96d56Sopenharmony_ci   no args. Setting it calls the mock with the value being set. ::
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci        >>> class Foo:
8307db96d56Sopenharmony_ci        ...     @property
8317db96d56Sopenharmony_ci        ...     def foo(self):
8327db96d56Sopenharmony_ci        ...         return 'something'
8337db96d56Sopenharmony_ci        ...     @foo.setter
8347db96d56Sopenharmony_ci        ...     def foo(self, value):
8357db96d56Sopenharmony_ci        ...         pass
8367db96d56Sopenharmony_ci        ...
8377db96d56Sopenharmony_ci        >>> with patch('__main__.Foo.foo', new_callable=PropertyMock) as mock_foo:
8387db96d56Sopenharmony_ci        ...     mock_foo.return_value = 'mockity-mock'
8397db96d56Sopenharmony_ci        ...     this_foo = Foo()
8407db96d56Sopenharmony_ci        ...     print(this_foo.foo)
8417db96d56Sopenharmony_ci        ...     this_foo.foo = 6
8427db96d56Sopenharmony_ci        ...
8437db96d56Sopenharmony_ci        mockity-mock
8447db96d56Sopenharmony_ci        >>> mock_foo.mock_calls
8457db96d56Sopenharmony_ci        [call(), call(6)]
8467db96d56Sopenharmony_ci
8477db96d56Sopenharmony_ciBecause of the way mock attributes are stored you can't directly attach a
8487db96d56Sopenharmony_ci:class:`PropertyMock` to a mock object. Instead you can attach it to the mock type
8497db96d56Sopenharmony_ciobject::
8507db96d56Sopenharmony_ci
8517db96d56Sopenharmony_ci    >>> m = MagicMock()
8527db96d56Sopenharmony_ci    >>> p = PropertyMock(return_value=3)
8537db96d56Sopenharmony_ci    >>> type(m).foo = p
8547db96d56Sopenharmony_ci    >>> m.foo
8557db96d56Sopenharmony_ci    3
8567db96d56Sopenharmony_ci    >>> p.assert_called_once_with()
8577db96d56Sopenharmony_ci
8587db96d56Sopenharmony_ci
8597db96d56Sopenharmony_ci.. class:: AsyncMock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs)
8607db96d56Sopenharmony_ci
8617db96d56Sopenharmony_ci  An asynchronous version of :class:`MagicMock`. The :class:`AsyncMock` object will
8627db96d56Sopenharmony_ci  behave so the object is recognized as an async function, and the result of a
8637db96d56Sopenharmony_ci  call is an awaitable.
8647db96d56Sopenharmony_ci
8657db96d56Sopenharmony_ci    >>> mock = AsyncMock()
8667db96d56Sopenharmony_ci    >>> asyncio.iscoroutinefunction(mock)
8677db96d56Sopenharmony_ci    True
8687db96d56Sopenharmony_ci    >>> inspect.isawaitable(mock())  # doctest: +SKIP
8697db96d56Sopenharmony_ci    True
8707db96d56Sopenharmony_ci
8717db96d56Sopenharmony_ci  The result of ``mock()`` is an async function which will have the outcome
8727db96d56Sopenharmony_ci  of ``side_effect`` or ``return_value`` after it has been awaited:
8737db96d56Sopenharmony_ci
8747db96d56Sopenharmony_ci  - if ``side_effect`` is a function, the async function will return the
8757db96d56Sopenharmony_ci    result of that function,
8767db96d56Sopenharmony_ci  - if ``side_effect`` is an exception, the async function will raise the
8777db96d56Sopenharmony_ci    exception,
8787db96d56Sopenharmony_ci  - if ``side_effect`` is an iterable, the async function will return the
8797db96d56Sopenharmony_ci    next value of the iterable, however, if the sequence of result is
8807db96d56Sopenharmony_ci    exhausted, ``StopAsyncIteration`` is raised immediately,
8817db96d56Sopenharmony_ci  - if ``side_effect`` is not defined, the async function will return the
8827db96d56Sopenharmony_ci    value defined by ``return_value``, hence, by default, the async function
8837db96d56Sopenharmony_ci    returns a new :class:`AsyncMock` object.
8847db96d56Sopenharmony_ci
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ci  Setting the *spec* of a :class:`Mock` or :class:`MagicMock` to an async function
8877db96d56Sopenharmony_ci  will result in a coroutine object being returned after calling.
8887db96d56Sopenharmony_ci
8897db96d56Sopenharmony_ci    >>> async def async_func(): pass
8907db96d56Sopenharmony_ci    ...
8917db96d56Sopenharmony_ci    >>> mock = MagicMock(async_func)
8927db96d56Sopenharmony_ci    >>> mock
8937db96d56Sopenharmony_ci    <MagicMock spec='function' id='...'>
8947db96d56Sopenharmony_ci    >>> mock()  # doctest: +SKIP
8957db96d56Sopenharmony_ci    <coroutine object AsyncMockMixin._mock_call at ...>
8967db96d56Sopenharmony_ci
8977db96d56Sopenharmony_ci
8987db96d56Sopenharmony_ci  Setting the *spec* of a :class:`Mock`, :class:`MagicMock`, or :class:`AsyncMock`
8997db96d56Sopenharmony_ci  to a class with asynchronous and synchronous functions will automatically
9007db96d56Sopenharmony_ci  detect the synchronous functions and set them as :class:`MagicMock` (if the
9017db96d56Sopenharmony_ci  parent mock is :class:`AsyncMock` or :class:`MagicMock`) or :class:`Mock` (if
9027db96d56Sopenharmony_ci  the parent mock is :class:`Mock`). All asynchronous functions will be
9037db96d56Sopenharmony_ci  :class:`AsyncMock`.
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_ci  >>> class ExampleClass:
9067db96d56Sopenharmony_ci  ...     def sync_foo():
9077db96d56Sopenharmony_ci  ...         pass
9087db96d56Sopenharmony_ci  ...     async def async_foo():
9097db96d56Sopenharmony_ci  ...         pass
9107db96d56Sopenharmony_ci  ...
9117db96d56Sopenharmony_ci  >>> a_mock = AsyncMock(ExampleClass)
9127db96d56Sopenharmony_ci  >>> a_mock.sync_foo
9137db96d56Sopenharmony_ci  <MagicMock name='mock.sync_foo' id='...'>
9147db96d56Sopenharmony_ci  >>> a_mock.async_foo
9157db96d56Sopenharmony_ci  <AsyncMock name='mock.async_foo' id='...'>
9167db96d56Sopenharmony_ci  >>> mock = Mock(ExampleClass)
9177db96d56Sopenharmony_ci  >>> mock.sync_foo
9187db96d56Sopenharmony_ci  <Mock name='mock.sync_foo' id='...'>
9197db96d56Sopenharmony_ci  >>> mock.async_foo
9207db96d56Sopenharmony_ci  <AsyncMock name='mock.async_foo' id='...'>
9217db96d56Sopenharmony_ci
9227db96d56Sopenharmony_ci  .. versionadded:: 3.8
9237db96d56Sopenharmony_ci
9247db96d56Sopenharmony_ci  .. method:: assert_awaited()
9257db96d56Sopenharmony_ci
9267db96d56Sopenharmony_ci      Assert that the mock was awaited at least once. Note that this is separate
9277db96d56Sopenharmony_ci      from the object having been called, the ``await`` keyword must be used:
9287db96d56Sopenharmony_ci
9297db96d56Sopenharmony_ci          >>> mock = AsyncMock()
9307db96d56Sopenharmony_ci          >>> async def main(coroutine_mock):
9317db96d56Sopenharmony_ci          ...     await coroutine_mock
9327db96d56Sopenharmony_ci          ...
9337db96d56Sopenharmony_ci          >>> coroutine_mock = mock()
9347db96d56Sopenharmony_ci          >>> mock.called
9357db96d56Sopenharmony_ci          True
9367db96d56Sopenharmony_ci          >>> mock.assert_awaited()
9377db96d56Sopenharmony_ci          Traceback (most recent call last):
9387db96d56Sopenharmony_ci          ...
9397db96d56Sopenharmony_ci          AssertionError: Expected mock to have been awaited.
9407db96d56Sopenharmony_ci          >>> asyncio.run(main(coroutine_mock))
9417db96d56Sopenharmony_ci          >>> mock.assert_awaited()
9427db96d56Sopenharmony_ci
9437db96d56Sopenharmony_ci  .. method:: assert_awaited_once()
9447db96d56Sopenharmony_ci
9457db96d56Sopenharmony_ci      Assert that the mock was awaited exactly once.
9467db96d56Sopenharmony_ci
9477db96d56Sopenharmony_ci        >>> mock = AsyncMock()
9487db96d56Sopenharmony_ci        >>> async def main():
9497db96d56Sopenharmony_ci        ...     await mock()
9507db96d56Sopenharmony_ci        ...
9517db96d56Sopenharmony_ci        >>> asyncio.run(main())
9527db96d56Sopenharmony_ci        >>> mock.assert_awaited_once()
9537db96d56Sopenharmony_ci        >>> asyncio.run(main())
9547db96d56Sopenharmony_ci        >>> mock.method.assert_awaited_once()
9557db96d56Sopenharmony_ci        Traceback (most recent call last):
9567db96d56Sopenharmony_ci        ...
9577db96d56Sopenharmony_ci        AssertionError: Expected mock to have been awaited once. Awaited 2 times.
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_ci  .. method:: assert_awaited_with(*args, **kwargs)
9607db96d56Sopenharmony_ci
9617db96d56Sopenharmony_ci      Assert that the last await was with the specified arguments.
9627db96d56Sopenharmony_ci
9637db96d56Sopenharmony_ci        >>> mock = AsyncMock()
9647db96d56Sopenharmony_ci        >>> async def main(*args, **kwargs):
9657db96d56Sopenharmony_ci        ...     await mock(*args, **kwargs)
9667db96d56Sopenharmony_ci        ...
9677db96d56Sopenharmony_ci        >>> asyncio.run(main('foo', bar='bar'))
9687db96d56Sopenharmony_ci        >>> mock.assert_awaited_with('foo', bar='bar')
9697db96d56Sopenharmony_ci        >>> mock.assert_awaited_with('other')
9707db96d56Sopenharmony_ci        Traceback (most recent call last):
9717db96d56Sopenharmony_ci        ...
9727db96d56Sopenharmony_ci        AssertionError: expected call not found.
9737db96d56Sopenharmony_ci        Expected: mock('other')
9747db96d56Sopenharmony_ci        Actual: mock('foo', bar='bar')
9757db96d56Sopenharmony_ci
9767db96d56Sopenharmony_ci  .. method:: assert_awaited_once_with(*args, **kwargs)
9777db96d56Sopenharmony_ci
9787db96d56Sopenharmony_ci      Assert that the mock was awaited exactly once and with the specified
9797db96d56Sopenharmony_ci      arguments.
9807db96d56Sopenharmony_ci
9817db96d56Sopenharmony_ci        >>> mock = AsyncMock()
9827db96d56Sopenharmony_ci        >>> async def main(*args, **kwargs):
9837db96d56Sopenharmony_ci        ...     await mock(*args, **kwargs)
9847db96d56Sopenharmony_ci        ...
9857db96d56Sopenharmony_ci        >>> asyncio.run(main('foo', bar='bar'))
9867db96d56Sopenharmony_ci        >>> mock.assert_awaited_once_with('foo', bar='bar')
9877db96d56Sopenharmony_ci        >>> asyncio.run(main('foo', bar='bar'))
9887db96d56Sopenharmony_ci        >>> mock.assert_awaited_once_with('foo', bar='bar')
9897db96d56Sopenharmony_ci        Traceback (most recent call last):
9907db96d56Sopenharmony_ci        ...
9917db96d56Sopenharmony_ci        AssertionError: Expected mock to have been awaited once. Awaited 2 times.
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ci  .. method:: assert_any_await(*args, **kwargs)
9947db96d56Sopenharmony_ci
9957db96d56Sopenharmony_ci      Assert the mock has ever been awaited with the specified arguments.
9967db96d56Sopenharmony_ci
9977db96d56Sopenharmony_ci        >>> mock = AsyncMock()
9987db96d56Sopenharmony_ci        >>> async def main(*args, **kwargs):
9997db96d56Sopenharmony_ci        ...     await mock(*args, **kwargs)
10007db96d56Sopenharmony_ci        ...
10017db96d56Sopenharmony_ci        >>> asyncio.run(main('foo', bar='bar'))
10027db96d56Sopenharmony_ci        >>> asyncio.run(main('hello'))
10037db96d56Sopenharmony_ci        >>> mock.assert_any_await('foo', bar='bar')
10047db96d56Sopenharmony_ci        >>> mock.assert_any_await('other')
10057db96d56Sopenharmony_ci        Traceback (most recent call last):
10067db96d56Sopenharmony_ci        ...
10077db96d56Sopenharmony_ci        AssertionError: mock('other') await not found
10087db96d56Sopenharmony_ci
10097db96d56Sopenharmony_ci  .. method:: assert_has_awaits(calls, any_order=False)
10107db96d56Sopenharmony_ci
10117db96d56Sopenharmony_ci      Assert the mock has been awaited with the specified calls.
10127db96d56Sopenharmony_ci      The :attr:`await_args_list` list is checked for the awaits.
10137db96d56Sopenharmony_ci
10147db96d56Sopenharmony_ci      If *any_order* is false then the awaits must be
10157db96d56Sopenharmony_ci      sequential. There can be extra calls before or after the
10167db96d56Sopenharmony_ci      specified awaits.
10177db96d56Sopenharmony_ci
10187db96d56Sopenharmony_ci      If *any_order* is true then the awaits can be in any order, but
10197db96d56Sopenharmony_ci      they must all appear in :attr:`await_args_list`.
10207db96d56Sopenharmony_ci
10217db96d56Sopenharmony_ci        >>> mock = AsyncMock()
10227db96d56Sopenharmony_ci        >>> async def main(*args, **kwargs):
10237db96d56Sopenharmony_ci        ...     await mock(*args, **kwargs)
10247db96d56Sopenharmony_ci        ...
10257db96d56Sopenharmony_ci        >>> calls = [call("foo"), call("bar")]
10267db96d56Sopenharmony_ci        >>> mock.assert_has_awaits(calls)
10277db96d56Sopenharmony_ci        Traceback (most recent call last):
10287db96d56Sopenharmony_ci        ...
10297db96d56Sopenharmony_ci        AssertionError: Awaits not found.
10307db96d56Sopenharmony_ci        Expected: [call('foo'), call('bar')]
10317db96d56Sopenharmony_ci        Actual: []
10327db96d56Sopenharmony_ci        >>> asyncio.run(main('foo'))
10337db96d56Sopenharmony_ci        >>> asyncio.run(main('bar'))
10347db96d56Sopenharmony_ci        >>> mock.assert_has_awaits(calls)
10357db96d56Sopenharmony_ci
10367db96d56Sopenharmony_ci  .. method:: assert_not_awaited()
10377db96d56Sopenharmony_ci
10387db96d56Sopenharmony_ci    Assert that the mock was never awaited.
10397db96d56Sopenharmony_ci
10407db96d56Sopenharmony_ci        >>> mock = AsyncMock()
10417db96d56Sopenharmony_ci        >>> mock.assert_not_awaited()
10427db96d56Sopenharmony_ci
10437db96d56Sopenharmony_ci  .. method:: reset_mock(*args, **kwargs)
10447db96d56Sopenharmony_ci
10457db96d56Sopenharmony_ci    See :func:`Mock.reset_mock`. Also sets :attr:`await_count` to 0,
10467db96d56Sopenharmony_ci    :attr:`await_args` to None, and clears the :attr:`await_args_list`.
10477db96d56Sopenharmony_ci
10487db96d56Sopenharmony_ci  .. attribute:: await_count
10497db96d56Sopenharmony_ci
10507db96d56Sopenharmony_ci    An integer keeping track of how many times the mock object has been awaited.
10517db96d56Sopenharmony_ci
10527db96d56Sopenharmony_ci      >>> mock = AsyncMock()
10537db96d56Sopenharmony_ci      >>> async def main():
10547db96d56Sopenharmony_ci      ...     await mock()
10557db96d56Sopenharmony_ci      ...
10567db96d56Sopenharmony_ci      >>> asyncio.run(main())
10577db96d56Sopenharmony_ci      >>> mock.await_count
10587db96d56Sopenharmony_ci      1
10597db96d56Sopenharmony_ci      >>> asyncio.run(main())
10607db96d56Sopenharmony_ci      >>> mock.await_count
10617db96d56Sopenharmony_ci      2
10627db96d56Sopenharmony_ci
10637db96d56Sopenharmony_ci  .. attribute:: await_args
10647db96d56Sopenharmony_ci
10657db96d56Sopenharmony_ci    This is either ``None`` (if the mock hasn’t been awaited), or the arguments that
10667db96d56Sopenharmony_ci    the mock was last awaited with. Functions the same as :attr:`Mock.call_args`.
10677db96d56Sopenharmony_ci
10687db96d56Sopenharmony_ci      >>> mock = AsyncMock()
10697db96d56Sopenharmony_ci      >>> async def main(*args):
10707db96d56Sopenharmony_ci      ...     await mock(*args)
10717db96d56Sopenharmony_ci      ...
10727db96d56Sopenharmony_ci      >>> mock.await_args
10737db96d56Sopenharmony_ci      >>> asyncio.run(main('foo'))
10747db96d56Sopenharmony_ci      >>> mock.await_args
10757db96d56Sopenharmony_ci      call('foo')
10767db96d56Sopenharmony_ci      >>> asyncio.run(main('bar'))
10777db96d56Sopenharmony_ci      >>> mock.await_args
10787db96d56Sopenharmony_ci      call('bar')
10797db96d56Sopenharmony_ci
10807db96d56Sopenharmony_ci
10817db96d56Sopenharmony_ci  .. attribute:: await_args_list
10827db96d56Sopenharmony_ci
10837db96d56Sopenharmony_ci    This is a list of all the awaits made to the mock object in sequence (so the
10847db96d56Sopenharmony_ci    length of the list is the number of times it has been awaited). Before any
10857db96d56Sopenharmony_ci    awaits have been made it is an empty list.
10867db96d56Sopenharmony_ci
10877db96d56Sopenharmony_ci      >>> mock = AsyncMock()
10887db96d56Sopenharmony_ci      >>> async def main(*args):
10897db96d56Sopenharmony_ci      ...     await mock(*args)
10907db96d56Sopenharmony_ci      ...
10917db96d56Sopenharmony_ci      >>> mock.await_args_list
10927db96d56Sopenharmony_ci      []
10937db96d56Sopenharmony_ci      >>> asyncio.run(main('foo'))
10947db96d56Sopenharmony_ci      >>> mock.await_args_list
10957db96d56Sopenharmony_ci      [call('foo')]
10967db96d56Sopenharmony_ci      >>> asyncio.run(main('bar'))
10977db96d56Sopenharmony_ci      >>> mock.await_args_list
10987db96d56Sopenharmony_ci      [call('foo'), call('bar')]
10997db96d56Sopenharmony_ci
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ciCalling
11027db96d56Sopenharmony_ci~~~~~~~
11037db96d56Sopenharmony_ci
11047db96d56Sopenharmony_ciMock objects are callable. The call will return the value set as the
11057db96d56Sopenharmony_ci:attr:`~Mock.return_value` attribute. The default return value is a new Mock
11067db96d56Sopenharmony_ciobject; it is created the first time the return value is accessed (either
11077db96d56Sopenharmony_ciexplicitly or by calling the Mock) - but it is stored and the same one
11087db96d56Sopenharmony_cireturned each time.
11097db96d56Sopenharmony_ci
11107db96d56Sopenharmony_ciCalls made to the object will be recorded in the attributes
11117db96d56Sopenharmony_cilike :attr:`~Mock.call_args` and :attr:`~Mock.call_args_list`.
11127db96d56Sopenharmony_ci
11137db96d56Sopenharmony_ciIf :attr:`~Mock.side_effect` is set then it will be called after the call has
11147db96d56Sopenharmony_cibeen recorded, so if :attr:`side_effect` raises an exception the call is still
11157db96d56Sopenharmony_cirecorded.
11167db96d56Sopenharmony_ci
11177db96d56Sopenharmony_ciThe simplest way to make a mock raise an exception when called is to make
11187db96d56Sopenharmony_ci:attr:`~Mock.side_effect` an exception class or instance:
11197db96d56Sopenharmony_ci
11207db96d56Sopenharmony_ci        >>> m = MagicMock(side_effect=IndexError)
11217db96d56Sopenharmony_ci        >>> m(1, 2, 3)
11227db96d56Sopenharmony_ci        Traceback (most recent call last):
11237db96d56Sopenharmony_ci          ...
11247db96d56Sopenharmony_ci        IndexError
11257db96d56Sopenharmony_ci        >>> m.mock_calls
11267db96d56Sopenharmony_ci        [call(1, 2, 3)]
11277db96d56Sopenharmony_ci        >>> m.side_effect = KeyError('Bang!')
11287db96d56Sopenharmony_ci        >>> m('two', 'three', 'four')
11297db96d56Sopenharmony_ci        Traceback (most recent call last):
11307db96d56Sopenharmony_ci          ...
11317db96d56Sopenharmony_ci        KeyError: 'Bang!'
11327db96d56Sopenharmony_ci        >>> m.mock_calls
11337db96d56Sopenharmony_ci        [call(1, 2, 3), call('two', 'three', 'four')]
11347db96d56Sopenharmony_ci
11357db96d56Sopenharmony_ciIf :attr:`side_effect` is a function then whatever that function returns is what
11367db96d56Sopenharmony_cicalls to the mock return. The :attr:`side_effect` function is called with the
11377db96d56Sopenharmony_cisame arguments as the mock. This allows you to vary the return value of the
11387db96d56Sopenharmony_cicall dynamically, based on the input:
11397db96d56Sopenharmony_ci
11407db96d56Sopenharmony_ci        >>> def side_effect(value):
11417db96d56Sopenharmony_ci        ...     return value + 1
11427db96d56Sopenharmony_ci        ...
11437db96d56Sopenharmony_ci        >>> m = MagicMock(side_effect=side_effect)
11447db96d56Sopenharmony_ci        >>> m(1)
11457db96d56Sopenharmony_ci        2
11467db96d56Sopenharmony_ci        >>> m(2)
11477db96d56Sopenharmony_ci        3
11487db96d56Sopenharmony_ci        >>> m.mock_calls
11497db96d56Sopenharmony_ci        [call(1), call(2)]
11507db96d56Sopenharmony_ci
11517db96d56Sopenharmony_ciIf you want the mock to still return the default return value (a new mock), or
11527db96d56Sopenharmony_ciany set return value, then there are two ways of doing this. Either return
11537db96d56Sopenharmony_ci:attr:`mock.return_value` from inside :attr:`side_effect`, or return :data:`DEFAULT`:
11547db96d56Sopenharmony_ci
11557db96d56Sopenharmony_ci        >>> m = MagicMock()
11567db96d56Sopenharmony_ci        >>> def side_effect(*args, **kwargs):
11577db96d56Sopenharmony_ci        ...     return m.return_value
11587db96d56Sopenharmony_ci        ...
11597db96d56Sopenharmony_ci        >>> m.side_effect = side_effect
11607db96d56Sopenharmony_ci        >>> m.return_value = 3
11617db96d56Sopenharmony_ci        >>> m()
11627db96d56Sopenharmony_ci        3
11637db96d56Sopenharmony_ci        >>> def side_effect(*args, **kwargs):
11647db96d56Sopenharmony_ci        ...     return DEFAULT
11657db96d56Sopenharmony_ci        ...
11667db96d56Sopenharmony_ci        >>> m.side_effect = side_effect
11677db96d56Sopenharmony_ci        >>> m()
11687db96d56Sopenharmony_ci        3
11697db96d56Sopenharmony_ci
11707db96d56Sopenharmony_ciTo remove a :attr:`side_effect`, and return to the default behaviour, set the
11717db96d56Sopenharmony_ci:attr:`side_effect` to ``None``:
11727db96d56Sopenharmony_ci
11737db96d56Sopenharmony_ci        >>> m = MagicMock(return_value=6)
11747db96d56Sopenharmony_ci        >>> def side_effect(*args, **kwargs):
11757db96d56Sopenharmony_ci        ...     return 3
11767db96d56Sopenharmony_ci        ...
11777db96d56Sopenharmony_ci        >>> m.side_effect = side_effect
11787db96d56Sopenharmony_ci        >>> m()
11797db96d56Sopenharmony_ci        3
11807db96d56Sopenharmony_ci        >>> m.side_effect = None
11817db96d56Sopenharmony_ci        >>> m()
11827db96d56Sopenharmony_ci        6
11837db96d56Sopenharmony_ci
11847db96d56Sopenharmony_ciThe :attr:`side_effect` can also be any iterable object. Repeated calls to the mock
11857db96d56Sopenharmony_ciwill return values from the iterable (until the iterable is exhausted and
11867db96d56Sopenharmony_cia :exc:`StopIteration` is raised):
11877db96d56Sopenharmony_ci
11887db96d56Sopenharmony_ci        >>> m = MagicMock(side_effect=[1, 2, 3])
11897db96d56Sopenharmony_ci        >>> m()
11907db96d56Sopenharmony_ci        1
11917db96d56Sopenharmony_ci        >>> m()
11927db96d56Sopenharmony_ci        2
11937db96d56Sopenharmony_ci        >>> m()
11947db96d56Sopenharmony_ci        3
11957db96d56Sopenharmony_ci        >>> m()
11967db96d56Sopenharmony_ci        Traceback (most recent call last):
11977db96d56Sopenharmony_ci          ...
11987db96d56Sopenharmony_ci        StopIteration
11997db96d56Sopenharmony_ci
12007db96d56Sopenharmony_ciIf any members of the iterable are exceptions they will be raised instead of
12017db96d56Sopenharmony_cireturned::
12027db96d56Sopenharmony_ci
12037db96d56Sopenharmony_ci        >>> iterable = (33, ValueError, 66)
12047db96d56Sopenharmony_ci        >>> m = MagicMock(side_effect=iterable)
12057db96d56Sopenharmony_ci        >>> m()
12067db96d56Sopenharmony_ci        33
12077db96d56Sopenharmony_ci        >>> m()
12087db96d56Sopenharmony_ci        Traceback (most recent call last):
12097db96d56Sopenharmony_ci         ...
12107db96d56Sopenharmony_ci        ValueError
12117db96d56Sopenharmony_ci        >>> m()
12127db96d56Sopenharmony_ci        66
12137db96d56Sopenharmony_ci
12147db96d56Sopenharmony_ci
12157db96d56Sopenharmony_ci.. _deleting-attributes:
12167db96d56Sopenharmony_ci
12177db96d56Sopenharmony_ciDeleting Attributes
12187db96d56Sopenharmony_ci~~~~~~~~~~~~~~~~~~~
12197db96d56Sopenharmony_ci
12207db96d56Sopenharmony_ciMock objects create attributes on demand. This allows them to pretend to be
12217db96d56Sopenharmony_ciobjects of any type.
12227db96d56Sopenharmony_ci
12237db96d56Sopenharmony_ciYou may want a mock object to return ``False`` to a :func:`hasattr` call, or raise an
12247db96d56Sopenharmony_ci:exc:`AttributeError` when an attribute is fetched. You can do this by providing
12257db96d56Sopenharmony_cian object as a :attr:`spec` for a mock, but that isn't always convenient.
12267db96d56Sopenharmony_ci
12277db96d56Sopenharmony_ciYou "block" attributes by deleting them. Once deleted, accessing an attribute
12287db96d56Sopenharmony_ciwill raise an :exc:`AttributeError`.
12297db96d56Sopenharmony_ci
12307db96d56Sopenharmony_ci    >>> mock = MagicMock()
12317db96d56Sopenharmony_ci    >>> hasattr(mock, 'm')
12327db96d56Sopenharmony_ci    True
12337db96d56Sopenharmony_ci    >>> del mock.m
12347db96d56Sopenharmony_ci    >>> hasattr(mock, 'm')
12357db96d56Sopenharmony_ci    False
12367db96d56Sopenharmony_ci    >>> del mock.f
12377db96d56Sopenharmony_ci    >>> mock.f
12387db96d56Sopenharmony_ci    Traceback (most recent call last):
12397db96d56Sopenharmony_ci        ...
12407db96d56Sopenharmony_ci    AttributeError: f
12417db96d56Sopenharmony_ci
12427db96d56Sopenharmony_ci
12437db96d56Sopenharmony_ciMock names and the name attribute
12447db96d56Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12457db96d56Sopenharmony_ci
12467db96d56Sopenharmony_ciSince "name" is an argument to the :class:`Mock` constructor, if you want your
12477db96d56Sopenharmony_cimock object to have a "name" attribute you can't just pass it in at creation
12487db96d56Sopenharmony_citime. There are two alternatives. One option is to use
12497db96d56Sopenharmony_ci:meth:`~Mock.configure_mock`::
12507db96d56Sopenharmony_ci
12517db96d56Sopenharmony_ci    >>> mock = MagicMock()
12527db96d56Sopenharmony_ci    >>> mock.configure_mock(name='my_name')
12537db96d56Sopenharmony_ci    >>> mock.name
12547db96d56Sopenharmony_ci    'my_name'
12557db96d56Sopenharmony_ci
12567db96d56Sopenharmony_ciA simpler option is to simply set the "name" attribute after mock creation::
12577db96d56Sopenharmony_ci
12587db96d56Sopenharmony_ci    >>> mock = MagicMock()
12597db96d56Sopenharmony_ci    >>> mock.name = "foo"
12607db96d56Sopenharmony_ci
12617db96d56Sopenharmony_ci
12627db96d56Sopenharmony_ciAttaching Mocks as Attributes
12637db96d56Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12647db96d56Sopenharmony_ci
12657db96d56Sopenharmony_ciWhen you attach a mock as an attribute of another mock (or as the return
12667db96d56Sopenharmony_civalue) it becomes a "child" of that mock. Calls to the child are recorded in
12677db96d56Sopenharmony_cithe :attr:`~Mock.method_calls` and :attr:`~Mock.mock_calls` attributes of the
12687db96d56Sopenharmony_ciparent. This is useful for configuring child mocks and then attaching them to
12697db96d56Sopenharmony_cithe parent, or for attaching mocks to a parent that records all calls to the
12707db96d56Sopenharmony_cichildren and allows you to make assertions about the order of calls between
12717db96d56Sopenharmony_cimocks:
12727db96d56Sopenharmony_ci
12737db96d56Sopenharmony_ci    >>> parent = MagicMock()
12747db96d56Sopenharmony_ci    >>> child1 = MagicMock(return_value=None)
12757db96d56Sopenharmony_ci    >>> child2 = MagicMock(return_value=None)
12767db96d56Sopenharmony_ci    >>> parent.child1 = child1
12777db96d56Sopenharmony_ci    >>> parent.child2 = child2
12787db96d56Sopenharmony_ci    >>> child1(1)
12797db96d56Sopenharmony_ci    >>> child2(2)
12807db96d56Sopenharmony_ci    >>> parent.mock_calls
12817db96d56Sopenharmony_ci    [call.child1(1), call.child2(2)]
12827db96d56Sopenharmony_ci
12837db96d56Sopenharmony_ciThe exception to this is if the mock has a name. This allows you to prevent
12847db96d56Sopenharmony_cithe "parenting" if for some reason you don't want it to happen.
12857db96d56Sopenharmony_ci
12867db96d56Sopenharmony_ci    >>> mock = MagicMock()
12877db96d56Sopenharmony_ci    >>> not_a_child = MagicMock(name='not-a-child')
12887db96d56Sopenharmony_ci    >>> mock.attribute = not_a_child
12897db96d56Sopenharmony_ci    >>> mock.attribute()
12907db96d56Sopenharmony_ci    <MagicMock name='not-a-child()' id='...'>
12917db96d56Sopenharmony_ci    >>> mock.mock_calls
12927db96d56Sopenharmony_ci    []
12937db96d56Sopenharmony_ci
12947db96d56Sopenharmony_ciMocks created for you by :func:`patch` are automatically given names. To
12957db96d56Sopenharmony_ciattach mocks that have names to a parent you use the :meth:`~Mock.attach_mock`
12967db96d56Sopenharmony_cimethod::
12977db96d56Sopenharmony_ci
12987db96d56Sopenharmony_ci    >>> thing1 = object()
12997db96d56Sopenharmony_ci    >>> thing2 = object()
13007db96d56Sopenharmony_ci    >>> parent = MagicMock()
13017db96d56Sopenharmony_ci    >>> with patch('__main__.thing1', return_value=None) as child1:
13027db96d56Sopenharmony_ci    ...     with patch('__main__.thing2', return_value=None) as child2:
13037db96d56Sopenharmony_ci    ...         parent.attach_mock(child1, 'child1')
13047db96d56Sopenharmony_ci    ...         parent.attach_mock(child2, 'child2')
13057db96d56Sopenharmony_ci    ...         child1('one')
13067db96d56Sopenharmony_ci    ...         child2('two')
13077db96d56Sopenharmony_ci    ...
13087db96d56Sopenharmony_ci    >>> parent.mock_calls
13097db96d56Sopenharmony_ci    [call.child1('one'), call.child2('two')]
13107db96d56Sopenharmony_ci
13117db96d56Sopenharmony_ci
13127db96d56Sopenharmony_ci.. [#] The only exceptions are magic methods and attributes (those that have
13137db96d56Sopenharmony_ci       leading and trailing double underscores). Mock doesn't create these but
13147db96d56Sopenharmony_ci       instead raises an :exc:`AttributeError`. This is because the interpreter
13157db96d56Sopenharmony_ci       will often implicitly request these methods, and gets *very* confused to
13167db96d56Sopenharmony_ci       get a new Mock object when it expects a magic method. If you need magic
13177db96d56Sopenharmony_ci       method support see :ref:`magic methods <magic-methods>`.
13187db96d56Sopenharmony_ci
13197db96d56Sopenharmony_ci
13207db96d56Sopenharmony_ciThe patchers
13217db96d56Sopenharmony_ci------------
13227db96d56Sopenharmony_ci
13237db96d56Sopenharmony_ciThe patch decorators are used for patching objects only within the scope of
13247db96d56Sopenharmony_cithe function they decorate. They automatically handle the unpatching for you,
13257db96d56Sopenharmony_cieven if exceptions are raised. All of these functions can also be used in with
13267db96d56Sopenharmony_cistatements or as class decorators.
13277db96d56Sopenharmony_ci
13287db96d56Sopenharmony_ci
13297db96d56Sopenharmony_cipatch
13307db96d56Sopenharmony_ci~~~~~
13317db96d56Sopenharmony_ci
13327db96d56Sopenharmony_ci.. note::
13337db96d56Sopenharmony_ci
13347db96d56Sopenharmony_ci    The key is to do the patching in the right namespace. See the section `where to patch`_.
13357db96d56Sopenharmony_ci
13367db96d56Sopenharmony_ci.. function:: patch(target, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)
13377db96d56Sopenharmony_ci
13387db96d56Sopenharmony_ci    :func:`patch` acts as a function decorator, class decorator or a context
13397db96d56Sopenharmony_ci    manager. Inside the body of the function or with statement, the *target*
13407db96d56Sopenharmony_ci    is patched with a *new* object. When the function/with statement exits
13417db96d56Sopenharmony_ci    the patch is undone.
13427db96d56Sopenharmony_ci
13437db96d56Sopenharmony_ci    If *new* is omitted, then the target is replaced with an
13447db96d56Sopenharmony_ci    :class:`AsyncMock` if the patched object is an async function or
13457db96d56Sopenharmony_ci    a :class:`MagicMock` otherwise.
13467db96d56Sopenharmony_ci    If :func:`patch` is used as a decorator and *new* is
13477db96d56Sopenharmony_ci    omitted, the created mock is passed in as an extra argument to the
13487db96d56Sopenharmony_ci    decorated function. If :func:`patch` is used as a context manager the created
13497db96d56Sopenharmony_ci    mock is returned by the context manager.
13507db96d56Sopenharmony_ci
13517db96d56Sopenharmony_ci    *target* should be a string in the form ``'package.module.ClassName'``. The
13527db96d56Sopenharmony_ci    *target* is imported and the specified object replaced with the *new*
13537db96d56Sopenharmony_ci    object, so the *target* must be importable from the environment you are
13547db96d56Sopenharmony_ci    calling :func:`patch` from. The target is imported when the decorated function
13557db96d56Sopenharmony_ci    is executed, not at decoration time.
13567db96d56Sopenharmony_ci
13577db96d56Sopenharmony_ci    The *spec* and *spec_set* keyword arguments are passed to the :class:`MagicMock`
13587db96d56Sopenharmony_ci    if patch is creating one for you.
13597db96d56Sopenharmony_ci
13607db96d56Sopenharmony_ci    In addition you can pass ``spec=True`` or ``spec_set=True``, which causes
13617db96d56Sopenharmony_ci    patch to pass in the object being mocked as the spec/spec_set object.
13627db96d56Sopenharmony_ci
13637db96d56Sopenharmony_ci    *new_callable* allows you to specify a different class, or callable object,
13647db96d56Sopenharmony_ci    that will be called to create the *new* object. By default :class:`AsyncMock`
13657db96d56Sopenharmony_ci    is used for async functions and :class:`MagicMock` for the rest.
13667db96d56Sopenharmony_ci
13677db96d56Sopenharmony_ci    A more powerful form of *spec* is *autospec*. If you set ``autospec=True``
13687db96d56Sopenharmony_ci    then the mock will be created with a spec from the object being replaced.
13697db96d56Sopenharmony_ci    All attributes of the mock will also have the spec of the corresponding
13707db96d56Sopenharmony_ci    attribute of the object being replaced. Methods and functions being mocked
13717db96d56Sopenharmony_ci    will have their arguments checked and will raise a :exc:`TypeError` if they are
13727db96d56Sopenharmony_ci    called with the wrong signature. For mocks
13737db96d56Sopenharmony_ci    replacing a class, their return value (the 'instance') will have the same
13747db96d56Sopenharmony_ci    spec as the class. See the :func:`create_autospec` function and
13757db96d56Sopenharmony_ci    :ref:`auto-speccing`.
13767db96d56Sopenharmony_ci
13777db96d56Sopenharmony_ci    Instead of ``autospec=True`` you can pass ``autospec=some_object`` to use an
13787db96d56Sopenharmony_ci    arbitrary object as the spec instead of the one being replaced.
13797db96d56Sopenharmony_ci
13807db96d56Sopenharmony_ci    By default :func:`patch` will fail to replace attributes that don't exist.
13817db96d56Sopenharmony_ci    If you pass in ``create=True``, and the attribute doesn't exist, patch will
13827db96d56Sopenharmony_ci    create the attribute for you when the patched function is called, and delete
13837db96d56Sopenharmony_ci    it again after the patched function has exited. This is useful for writing
13847db96d56Sopenharmony_ci    tests against attributes that your production code creates at runtime. It is
13857db96d56Sopenharmony_ci    off by default because it can be dangerous. With it switched on you can
13867db96d56Sopenharmony_ci    write passing tests against APIs that don't actually exist!
13877db96d56Sopenharmony_ci
13887db96d56Sopenharmony_ci    .. note::
13897db96d56Sopenharmony_ci
13907db96d56Sopenharmony_ci        .. versionchanged:: 3.5
13917db96d56Sopenharmony_ci           If you are patching builtins in a module then you don't
13927db96d56Sopenharmony_ci           need to pass ``create=True``, it will be added by default.
13937db96d56Sopenharmony_ci
13947db96d56Sopenharmony_ci    Patch can be used as a :class:`TestCase` class decorator. It works by
13957db96d56Sopenharmony_ci    decorating each test method in the class. This reduces the boilerplate
13967db96d56Sopenharmony_ci    code when your test methods share a common patchings set. :func:`patch` finds
13977db96d56Sopenharmony_ci    tests by looking for method names that start with ``patch.TEST_PREFIX``.
13987db96d56Sopenharmony_ci    By default this is ``'test'``, which matches the way :mod:`unittest` finds tests.
13997db96d56Sopenharmony_ci    You can specify an alternative prefix by setting ``patch.TEST_PREFIX``.
14007db96d56Sopenharmony_ci
14017db96d56Sopenharmony_ci    Patch can be used as a context manager, with the with statement. Here the
14027db96d56Sopenharmony_ci    patching applies to the indented block after the with statement. If you
14037db96d56Sopenharmony_ci    use "as" then the patched object will be bound to the name after the
14047db96d56Sopenharmony_ci    "as"; very useful if :func:`patch` is creating a mock object for you.
14057db96d56Sopenharmony_ci
14067db96d56Sopenharmony_ci    :func:`patch` takes arbitrary keyword arguments. These will be passed to
14077db96d56Sopenharmony_ci    :class:`AsyncMock` if the patched object is asynchronous, to
14087db96d56Sopenharmony_ci    :class:`MagicMock` otherwise or to *new_callable* if specified.
14097db96d56Sopenharmony_ci
14107db96d56Sopenharmony_ci    ``patch.dict(...)``, ``patch.multiple(...)`` and ``patch.object(...)`` are
14117db96d56Sopenharmony_ci    available for alternate use-cases.
14127db96d56Sopenharmony_ci
14137db96d56Sopenharmony_ci:func:`patch` as function decorator, creating the mock for you and passing it into
14147db96d56Sopenharmony_cithe decorated function::
14157db96d56Sopenharmony_ci
14167db96d56Sopenharmony_ci    >>> @patch('__main__.SomeClass')
14177db96d56Sopenharmony_ci    ... def function(normal_argument, mock_class):
14187db96d56Sopenharmony_ci    ...     print(mock_class is SomeClass)
14197db96d56Sopenharmony_ci    ...
14207db96d56Sopenharmony_ci    >>> function(None)
14217db96d56Sopenharmony_ci    True
14227db96d56Sopenharmony_ci
14237db96d56Sopenharmony_ciPatching a class replaces the class with a :class:`MagicMock` *instance*. If the
14247db96d56Sopenharmony_ciclass is instantiated in the code under test then it will be the
14257db96d56Sopenharmony_ci:attr:`~Mock.return_value` of the mock that will be used.
14267db96d56Sopenharmony_ci
14277db96d56Sopenharmony_ciIf the class is instantiated multiple times you could use
14287db96d56Sopenharmony_ci:attr:`~Mock.side_effect` to return a new mock each time. Alternatively you
14297db96d56Sopenharmony_cican set the *return_value* to be anything you want.
14307db96d56Sopenharmony_ci
14317db96d56Sopenharmony_ciTo configure return values on methods of *instances* on the patched class
14327db96d56Sopenharmony_ciyou must do this on the :attr:`return_value`. For example::
14337db96d56Sopenharmony_ci
14347db96d56Sopenharmony_ci    >>> class Class:
14357db96d56Sopenharmony_ci    ...     def method(self):
14367db96d56Sopenharmony_ci    ...         pass
14377db96d56Sopenharmony_ci    ...
14387db96d56Sopenharmony_ci    >>> with patch('__main__.Class') as MockClass:
14397db96d56Sopenharmony_ci    ...     instance = MockClass.return_value
14407db96d56Sopenharmony_ci    ...     instance.method.return_value = 'foo'
14417db96d56Sopenharmony_ci    ...     assert Class() is instance
14427db96d56Sopenharmony_ci    ...     assert Class().method() == 'foo'
14437db96d56Sopenharmony_ci    ...
14447db96d56Sopenharmony_ci
14457db96d56Sopenharmony_ciIf you use *spec* or *spec_set* and :func:`patch` is replacing a *class*, then the
14467db96d56Sopenharmony_cireturn value of the created mock will have the same spec. ::
14477db96d56Sopenharmony_ci
14487db96d56Sopenharmony_ci    >>> Original = Class
14497db96d56Sopenharmony_ci    >>> patcher = patch('__main__.Class', spec=True)
14507db96d56Sopenharmony_ci    >>> MockClass = patcher.start()
14517db96d56Sopenharmony_ci    >>> instance = MockClass()
14527db96d56Sopenharmony_ci    >>> assert isinstance(instance, Original)
14537db96d56Sopenharmony_ci    >>> patcher.stop()
14547db96d56Sopenharmony_ci
14557db96d56Sopenharmony_ciThe *new_callable* argument is useful where you want to use an alternative
14567db96d56Sopenharmony_ciclass to the default :class:`MagicMock` for the created mock. For example, if
14577db96d56Sopenharmony_ciyou wanted a :class:`NonCallableMock` to be used::
14587db96d56Sopenharmony_ci
14597db96d56Sopenharmony_ci    >>> thing = object()
14607db96d56Sopenharmony_ci    >>> with patch('__main__.thing', new_callable=NonCallableMock) as mock_thing:
14617db96d56Sopenharmony_ci    ...     assert thing is mock_thing
14627db96d56Sopenharmony_ci    ...     thing()
14637db96d56Sopenharmony_ci    ...
14647db96d56Sopenharmony_ci    Traceback (most recent call last):
14657db96d56Sopenharmony_ci      ...
14667db96d56Sopenharmony_ci    TypeError: 'NonCallableMock' object is not callable
14677db96d56Sopenharmony_ci
14687db96d56Sopenharmony_ciAnother use case might be to replace an object with an :class:`io.StringIO` instance::
14697db96d56Sopenharmony_ci
14707db96d56Sopenharmony_ci    >>> from io import StringIO
14717db96d56Sopenharmony_ci    >>> def foo():
14727db96d56Sopenharmony_ci    ...     print('Something')
14737db96d56Sopenharmony_ci    ...
14747db96d56Sopenharmony_ci    >>> @patch('sys.stdout', new_callable=StringIO)
14757db96d56Sopenharmony_ci    ... def test(mock_stdout):
14767db96d56Sopenharmony_ci    ...     foo()
14777db96d56Sopenharmony_ci    ...     assert mock_stdout.getvalue() == 'Something\n'
14787db96d56Sopenharmony_ci    ...
14797db96d56Sopenharmony_ci    >>> test()
14807db96d56Sopenharmony_ci
14817db96d56Sopenharmony_ciWhen :func:`patch` is creating a mock for you, it is common that the first thing
14827db96d56Sopenharmony_ciyou need to do is to configure the mock. Some of that configuration can be done
14837db96d56Sopenharmony_ciin the call to patch. Any arbitrary keywords you pass into the call will be
14847db96d56Sopenharmony_ciused to set attributes on the created mock::
14857db96d56Sopenharmony_ci
14867db96d56Sopenharmony_ci    >>> patcher = patch('__main__.thing', first='one', second='two')
14877db96d56Sopenharmony_ci    >>> mock_thing = patcher.start()
14887db96d56Sopenharmony_ci    >>> mock_thing.first
14897db96d56Sopenharmony_ci    'one'
14907db96d56Sopenharmony_ci    >>> mock_thing.second
14917db96d56Sopenharmony_ci    'two'
14927db96d56Sopenharmony_ci
14937db96d56Sopenharmony_ciAs well as attributes on the created mock attributes, like the
14947db96d56Sopenharmony_ci:attr:`~Mock.return_value` and :attr:`~Mock.side_effect`, of child mocks can
14957db96d56Sopenharmony_cialso be configured. These aren't syntactically valid to pass in directly as
14967db96d56Sopenharmony_cikeyword arguments, but a dictionary with these as keys can still be expanded
14977db96d56Sopenharmony_ciinto a :func:`patch` call using ``**``::
14987db96d56Sopenharmony_ci
14997db96d56Sopenharmony_ci    >>> config = {'method.return_value': 3, 'other.side_effect': KeyError}
15007db96d56Sopenharmony_ci    >>> patcher = patch('__main__.thing', **config)
15017db96d56Sopenharmony_ci    >>> mock_thing = patcher.start()
15027db96d56Sopenharmony_ci    >>> mock_thing.method()
15037db96d56Sopenharmony_ci    3
15047db96d56Sopenharmony_ci    >>> mock_thing.other()
15057db96d56Sopenharmony_ci    Traceback (most recent call last):
15067db96d56Sopenharmony_ci      ...
15077db96d56Sopenharmony_ci    KeyError
15087db96d56Sopenharmony_ci
15097db96d56Sopenharmony_ciBy default, attempting to patch a function in a module (or a method or an
15107db96d56Sopenharmony_ciattribute in a class) that does not exist will fail with :exc:`AttributeError`::
15117db96d56Sopenharmony_ci
15127db96d56Sopenharmony_ci    >>> @patch('sys.non_existing_attribute', 42)
15137db96d56Sopenharmony_ci    ... def test():
15147db96d56Sopenharmony_ci    ...     assert sys.non_existing_attribute == 42
15157db96d56Sopenharmony_ci    ...
15167db96d56Sopenharmony_ci    >>> test()
15177db96d56Sopenharmony_ci    Traceback (most recent call last):
15187db96d56Sopenharmony_ci      ...
15197db96d56Sopenharmony_ci    AttributeError: <module 'sys' (built-in)> does not have the attribute 'non_existing_attribute'
15207db96d56Sopenharmony_ci
15217db96d56Sopenharmony_cibut adding ``create=True`` in the call to :func:`patch` will make the previous example
15227db96d56Sopenharmony_ciwork as expected::
15237db96d56Sopenharmony_ci
15247db96d56Sopenharmony_ci    >>> @patch('sys.non_existing_attribute', 42, create=True)
15257db96d56Sopenharmony_ci    ... def test(mock_stdout):
15267db96d56Sopenharmony_ci    ...     assert sys.non_existing_attribute == 42
15277db96d56Sopenharmony_ci    ...
15287db96d56Sopenharmony_ci    >>> test()
15297db96d56Sopenharmony_ci
15307db96d56Sopenharmony_ci.. versionchanged:: 3.8
15317db96d56Sopenharmony_ci
15327db96d56Sopenharmony_ci    :func:`patch` now returns an :class:`AsyncMock` if the target is an async function.
15337db96d56Sopenharmony_ci
15347db96d56Sopenharmony_ci
15357db96d56Sopenharmony_cipatch.object
15367db96d56Sopenharmony_ci~~~~~~~~~~~~
15377db96d56Sopenharmony_ci
15387db96d56Sopenharmony_ci.. function:: patch.object(target, attribute, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)
15397db96d56Sopenharmony_ci
15407db96d56Sopenharmony_ci    patch the named member (*attribute*) on an object (*target*) with a mock
15417db96d56Sopenharmony_ci    object.
15427db96d56Sopenharmony_ci
15437db96d56Sopenharmony_ci    :func:`patch.object` can be used as a decorator, class decorator or a context
15447db96d56Sopenharmony_ci    manager. Arguments *new*, *spec*, *create*, *spec_set*, *autospec* and
15457db96d56Sopenharmony_ci    *new_callable* have the same meaning as for :func:`patch`. Like :func:`patch`,
15467db96d56Sopenharmony_ci    :func:`patch.object` takes arbitrary keyword arguments for configuring the mock
15477db96d56Sopenharmony_ci    object it creates.
15487db96d56Sopenharmony_ci
15497db96d56Sopenharmony_ci    When used as a class decorator :func:`patch.object` honours ``patch.TEST_PREFIX``
15507db96d56Sopenharmony_ci    for choosing which methods to wrap.
15517db96d56Sopenharmony_ci
15527db96d56Sopenharmony_ciYou can either call :func:`patch.object` with three arguments or two arguments. The
15537db96d56Sopenharmony_cithree argument form takes the object to be patched, the attribute name and the
15547db96d56Sopenharmony_ciobject to replace the attribute with.
15557db96d56Sopenharmony_ci
15567db96d56Sopenharmony_ciWhen calling with the two argument form you omit the replacement object, and a
15577db96d56Sopenharmony_cimock is created for you and passed in as an extra argument to the decorated
15587db96d56Sopenharmony_cifunction:
15597db96d56Sopenharmony_ci
15607db96d56Sopenharmony_ci    >>> @patch.object(SomeClass, 'class_method')
15617db96d56Sopenharmony_ci    ... def test(mock_method):
15627db96d56Sopenharmony_ci    ...     SomeClass.class_method(3)
15637db96d56Sopenharmony_ci    ...     mock_method.assert_called_with(3)
15647db96d56Sopenharmony_ci    ...
15657db96d56Sopenharmony_ci    >>> test()
15667db96d56Sopenharmony_ci
15677db96d56Sopenharmony_ci*spec*, *create* and the other arguments to :func:`patch.object` have the same
15687db96d56Sopenharmony_cimeaning as they do for :func:`patch`.
15697db96d56Sopenharmony_ci
15707db96d56Sopenharmony_ci
15717db96d56Sopenharmony_cipatch.dict
15727db96d56Sopenharmony_ci~~~~~~~~~~
15737db96d56Sopenharmony_ci
15747db96d56Sopenharmony_ci.. function:: patch.dict(in_dict, values=(), clear=False, **kwargs)
15757db96d56Sopenharmony_ci
15767db96d56Sopenharmony_ci    Patch a dictionary, or dictionary like object, and restore the dictionary
15777db96d56Sopenharmony_ci    to its original state after the test.
15787db96d56Sopenharmony_ci
15797db96d56Sopenharmony_ci    *in_dict* can be a dictionary or a mapping like container. If it is a
15807db96d56Sopenharmony_ci    mapping then it must at least support getting, setting and deleting items
15817db96d56Sopenharmony_ci    plus iterating over keys.
15827db96d56Sopenharmony_ci
15837db96d56Sopenharmony_ci    *in_dict* can also be a string specifying the name of the dictionary, which
15847db96d56Sopenharmony_ci    will then be fetched by importing it.
15857db96d56Sopenharmony_ci
15867db96d56Sopenharmony_ci    *values* can be a dictionary of values to set in the dictionary. *values*
15877db96d56Sopenharmony_ci    can also be an iterable of ``(key, value)`` pairs.
15887db96d56Sopenharmony_ci
15897db96d56Sopenharmony_ci    If *clear* is true then the dictionary will be cleared before the new
15907db96d56Sopenharmony_ci    values are set.
15917db96d56Sopenharmony_ci
15927db96d56Sopenharmony_ci    :func:`patch.dict` can also be called with arbitrary keyword arguments to set
15937db96d56Sopenharmony_ci    values in the dictionary.
15947db96d56Sopenharmony_ci
15957db96d56Sopenharmony_ci    .. versionchanged:: 3.8
15967db96d56Sopenharmony_ci
15977db96d56Sopenharmony_ci        :func:`patch.dict` now returns the patched dictionary when used as a context
15987db96d56Sopenharmony_ci        manager.
15997db96d56Sopenharmony_ci
16007db96d56Sopenharmony_ci:func:`patch.dict` can be used as a context manager, decorator or class
16017db96d56Sopenharmony_cidecorator:
16027db96d56Sopenharmony_ci
16037db96d56Sopenharmony_ci    >>> foo = {}
16047db96d56Sopenharmony_ci    >>> @patch.dict(foo, {'newkey': 'newvalue'})
16057db96d56Sopenharmony_ci    ... def test():
16067db96d56Sopenharmony_ci    ...     assert foo == {'newkey': 'newvalue'}
16077db96d56Sopenharmony_ci    >>> test()
16087db96d56Sopenharmony_ci    >>> assert foo == {}
16097db96d56Sopenharmony_ci
16107db96d56Sopenharmony_ciWhen used as a class decorator :func:`patch.dict` honours
16117db96d56Sopenharmony_ci``patch.TEST_PREFIX`` (default to ``'test'``) for choosing which methods to wrap:
16127db96d56Sopenharmony_ci
16137db96d56Sopenharmony_ci    >>> import os
16147db96d56Sopenharmony_ci    >>> import unittest
16157db96d56Sopenharmony_ci    >>> from unittest.mock import patch
16167db96d56Sopenharmony_ci    >>> @patch.dict('os.environ', {'newkey': 'newvalue'})
16177db96d56Sopenharmony_ci    ... class TestSample(unittest.TestCase):
16187db96d56Sopenharmony_ci    ...     def test_sample(self):
16197db96d56Sopenharmony_ci    ...         self.assertEqual(os.environ['newkey'], 'newvalue')
16207db96d56Sopenharmony_ci
16217db96d56Sopenharmony_ciIf you want to use a different prefix for your test, you can inform the
16227db96d56Sopenharmony_cipatchers of the different prefix by setting ``patch.TEST_PREFIX``. For
16237db96d56Sopenharmony_cimore details about how to change the value of see :ref:`test-prefix`.
16247db96d56Sopenharmony_ci
16257db96d56Sopenharmony_ci:func:`patch.dict` can be used to add members to a dictionary, or simply let a test
16267db96d56Sopenharmony_cichange a dictionary, and ensure the dictionary is restored when the test
16277db96d56Sopenharmony_ciends.
16287db96d56Sopenharmony_ci
16297db96d56Sopenharmony_ci    >>> foo = {}
16307db96d56Sopenharmony_ci    >>> with patch.dict(foo, {'newkey': 'newvalue'}) as patched_foo:
16317db96d56Sopenharmony_ci    ...     assert foo == {'newkey': 'newvalue'}
16327db96d56Sopenharmony_ci    ...     assert patched_foo == {'newkey': 'newvalue'}
16337db96d56Sopenharmony_ci    ...     # You can add, update or delete keys of foo (or patched_foo, it's the same dict)
16347db96d56Sopenharmony_ci    ...     patched_foo['spam'] = 'eggs'
16357db96d56Sopenharmony_ci    ...
16367db96d56Sopenharmony_ci    >>> assert foo == {}
16377db96d56Sopenharmony_ci    >>> assert patched_foo == {}
16387db96d56Sopenharmony_ci
16397db96d56Sopenharmony_ci    >>> import os
16407db96d56Sopenharmony_ci    >>> with patch.dict('os.environ', {'newkey': 'newvalue'}):
16417db96d56Sopenharmony_ci    ...     print(os.environ['newkey'])
16427db96d56Sopenharmony_ci    ...
16437db96d56Sopenharmony_ci    newvalue
16447db96d56Sopenharmony_ci    >>> assert 'newkey' not in os.environ
16457db96d56Sopenharmony_ci
16467db96d56Sopenharmony_ciKeywords can be used in the :func:`patch.dict` call to set values in the dictionary:
16477db96d56Sopenharmony_ci
16487db96d56Sopenharmony_ci    >>> mymodule = MagicMock()
16497db96d56Sopenharmony_ci    >>> mymodule.function.return_value = 'fish'
16507db96d56Sopenharmony_ci    >>> with patch.dict('sys.modules', mymodule=mymodule):
16517db96d56Sopenharmony_ci    ...     import mymodule
16527db96d56Sopenharmony_ci    ...     mymodule.function('some', 'args')
16537db96d56Sopenharmony_ci    ...
16547db96d56Sopenharmony_ci    'fish'
16557db96d56Sopenharmony_ci
16567db96d56Sopenharmony_ci:func:`patch.dict` can be used with dictionary like objects that aren't actually
16577db96d56Sopenharmony_cidictionaries. At the very minimum they must support item getting, setting,
16587db96d56Sopenharmony_cideleting and either iteration or membership test. This corresponds to the
16597db96d56Sopenharmony_cimagic methods :meth:`__getitem__`, :meth:`__setitem__`, :meth:`__delitem__` and either
16607db96d56Sopenharmony_ci:meth:`__iter__` or :meth:`__contains__`.
16617db96d56Sopenharmony_ci
16627db96d56Sopenharmony_ci    >>> class Container:
16637db96d56Sopenharmony_ci    ...     def __init__(self):
16647db96d56Sopenharmony_ci    ...         self.values = {}
16657db96d56Sopenharmony_ci    ...     def __getitem__(self, name):
16667db96d56Sopenharmony_ci    ...         return self.values[name]
16677db96d56Sopenharmony_ci    ...     def __setitem__(self, name, value):
16687db96d56Sopenharmony_ci    ...         self.values[name] = value
16697db96d56Sopenharmony_ci    ...     def __delitem__(self, name):
16707db96d56Sopenharmony_ci    ...         del self.values[name]
16717db96d56Sopenharmony_ci    ...     def __iter__(self):
16727db96d56Sopenharmony_ci    ...         return iter(self.values)
16737db96d56Sopenharmony_ci    ...
16747db96d56Sopenharmony_ci    >>> thing = Container()
16757db96d56Sopenharmony_ci    >>> thing['one'] = 1
16767db96d56Sopenharmony_ci    >>> with patch.dict(thing, one=2, two=3):
16777db96d56Sopenharmony_ci    ...     assert thing['one'] == 2
16787db96d56Sopenharmony_ci    ...     assert thing['two'] == 3
16797db96d56Sopenharmony_ci    ...
16807db96d56Sopenharmony_ci    >>> assert thing['one'] == 1
16817db96d56Sopenharmony_ci    >>> assert list(thing) == ['one']
16827db96d56Sopenharmony_ci
16837db96d56Sopenharmony_ci
16847db96d56Sopenharmony_cipatch.multiple
16857db96d56Sopenharmony_ci~~~~~~~~~~~~~~
16867db96d56Sopenharmony_ci
16877db96d56Sopenharmony_ci.. function:: patch.multiple(target, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)
16887db96d56Sopenharmony_ci
16897db96d56Sopenharmony_ci    Perform multiple patches in a single call. It takes the object to be
16907db96d56Sopenharmony_ci    patched (either as an object or a string to fetch the object by importing)
16917db96d56Sopenharmony_ci    and keyword arguments for the patches::
16927db96d56Sopenharmony_ci
16937db96d56Sopenharmony_ci        with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
16947db96d56Sopenharmony_ci            ...
16957db96d56Sopenharmony_ci
16967db96d56Sopenharmony_ci    Use :data:`DEFAULT` as the value if you want :func:`patch.multiple` to create
16977db96d56Sopenharmony_ci    mocks for you. In this case the created mocks are passed into a decorated
16987db96d56Sopenharmony_ci    function by keyword, and a dictionary is returned when :func:`patch.multiple` is
16997db96d56Sopenharmony_ci    used as a context manager.
17007db96d56Sopenharmony_ci
17017db96d56Sopenharmony_ci    :func:`patch.multiple` can be used as a decorator, class decorator or a context
17027db96d56Sopenharmony_ci    manager. The arguments *spec*, *spec_set*, *create*, *autospec* and
17037db96d56Sopenharmony_ci    *new_callable* have the same meaning as for :func:`patch`. These arguments will
17047db96d56Sopenharmony_ci    be applied to *all* patches done by :func:`patch.multiple`.
17057db96d56Sopenharmony_ci
17067db96d56Sopenharmony_ci    When used as a class decorator :func:`patch.multiple` honours ``patch.TEST_PREFIX``
17077db96d56Sopenharmony_ci    for choosing which methods to wrap.
17087db96d56Sopenharmony_ci
17097db96d56Sopenharmony_ciIf you want :func:`patch.multiple` to create mocks for you, then you can use
17107db96d56Sopenharmony_ci:data:`DEFAULT` as the value. If you use :func:`patch.multiple` as a decorator
17117db96d56Sopenharmony_cithen the created mocks are passed into the decorated function by keyword. ::
17127db96d56Sopenharmony_ci
17137db96d56Sopenharmony_ci    >>> thing = object()
17147db96d56Sopenharmony_ci    >>> other = object()
17157db96d56Sopenharmony_ci
17167db96d56Sopenharmony_ci    >>> @patch.multiple('__main__', thing=DEFAULT, other=DEFAULT)
17177db96d56Sopenharmony_ci    ... def test_function(thing, other):
17187db96d56Sopenharmony_ci    ...     assert isinstance(thing, MagicMock)
17197db96d56Sopenharmony_ci    ...     assert isinstance(other, MagicMock)
17207db96d56Sopenharmony_ci    ...
17217db96d56Sopenharmony_ci    >>> test_function()
17227db96d56Sopenharmony_ci
17237db96d56Sopenharmony_ci:func:`patch.multiple` can be nested with other ``patch`` decorators, but put arguments
17247db96d56Sopenharmony_cipassed by keyword *after* any of the standard arguments created by :func:`patch`::
17257db96d56Sopenharmony_ci
17267db96d56Sopenharmony_ci    >>> @patch('sys.exit')
17277db96d56Sopenharmony_ci    ... @patch.multiple('__main__', thing=DEFAULT, other=DEFAULT)
17287db96d56Sopenharmony_ci    ... def test_function(mock_exit, other, thing):
17297db96d56Sopenharmony_ci    ...     assert 'other' in repr(other)
17307db96d56Sopenharmony_ci    ...     assert 'thing' in repr(thing)
17317db96d56Sopenharmony_ci    ...     assert 'exit' in repr(mock_exit)
17327db96d56Sopenharmony_ci    ...
17337db96d56Sopenharmony_ci    >>> test_function()
17347db96d56Sopenharmony_ci
17357db96d56Sopenharmony_ciIf :func:`patch.multiple` is used as a context manager, the value returned by the
17367db96d56Sopenharmony_cicontext manager is a dictionary where created mocks are keyed by name::
17377db96d56Sopenharmony_ci
17387db96d56Sopenharmony_ci    >>> with patch.multiple('__main__', thing=DEFAULT, other=DEFAULT) as values:
17397db96d56Sopenharmony_ci    ...     assert 'other' in repr(values['other'])
17407db96d56Sopenharmony_ci    ...     assert 'thing' in repr(values['thing'])
17417db96d56Sopenharmony_ci    ...     assert values['thing'] is thing
17427db96d56Sopenharmony_ci    ...     assert values['other'] is other
17437db96d56Sopenharmony_ci    ...
17447db96d56Sopenharmony_ci
17457db96d56Sopenharmony_ci
17467db96d56Sopenharmony_ci.. _start-and-stop:
17477db96d56Sopenharmony_ci
17487db96d56Sopenharmony_cipatch methods: start and stop
17497db96d56Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17507db96d56Sopenharmony_ci
17517db96d56Sopenharmony_ciAll the patchers have :meth:`start` and :meth:`stop` methods. These make it simpler to do
17527db96d56Sopenharmony_cipatching in ``setUp`` methods or where you want to do multiple patches without
17537db96d56Sopenharmony_cinesting decorators or with statements.
17547db96d56Sopenharmony_ci
17557db96d56Sopenharmony_ciTo use them call :func:`patch`, :func:`patch.object` or :func:`patch.dict` as
17567db96d56Sopenharmony_cinormal and keep a reference to the returned ``patcher`` object. You can then
17577db96d56Sopenharmony_cicall :meth:`start` to put the patch in place and :meth:`stop` to undo it.
17587db96d56Sopenharmony_ci
17597db96d56Sopenharmony_ciIf you are using :func:`patch` to create a mock for you then it will be returned by
17607db96d56Sopenharmony_cithe call to ``patcher.start``. ::
17617db96d56Sopenharmony_ci
17627db96d56Sopenharmony_ci    >>> patcher = patch('package.module.ClassName')
17637db96d56Sopenharmony_ci    >>> from package import module
17647db96d56Sopenharmony_ci    >>> original = module.ClassName
17657db96d56Sopenharmony_ci    >>> new_mock = patcher.start()
17667db96d56Sopenharmony_ci    >>> assert module.ClassName is not original
17677db96d56Sopenharmony_ci    >>> assert module.ClassName is new_mock
17687db96d56Sopenharmony_ci    >>> patcher.stop()
17697db96d56Sopenharmony_ci    >>> assert module.ClassName is original
17707db96d56Sopenharmony_ci    >>> assert module.ClassName is not new_mock
17717db96d56Sopenharmony_ci
17727db96d56Sopenharmony_ci
17737db96d56Sopenharmony_ciA typical use case for this might be for doing multiple patches in the ``setUp``
17747db96d56Sopenharmony_cimethod of a :class:`TestCase`::
17757db96d56Sopenharmony_ci
17767db96d56Sopenharmony_ci    >>> class MyTest(unittest.TestCase):
17777db96d56Sopenharmony_ci    ...     def setUp(self):
17787db96d56Sopenharmony_ci    ...         self.patcher1 = patch('package.module.Class1')
17797db96d56Sopenharmony_ci    ...         self.patcher2 = patch('package.module.Class2')
17807db96d56Sopenharmony_ci    ...         self.MockClass1 = self.patcher1.start()
17817db96d56Sopenharmony_ci    ...         self.MockClass2 = self.patcher2.start()
17827db96d56Sopenharmony_ci    ...
17837db96d56Sopenharmony_ci    ...     def tearDown(self):
17847db96d56Sopenharmony_ci    ...         self.patcher1.stop()
17857db96d56Sopenharmony_ci    ...         self.patcher2.stop()
17867db96d56Sopenharmony_ci    ...
17877db96d56Sopenharmony_ci    ...     def test_something(self):
17887db96d56Sopenharmony_ci    ...         assert package.module.Class1 is self.MockClass1
17897db96d56Sopenharmony_ci    ...         assert package.module.Class2 is self.MockClass2
17907db96d56Sopenharmony_ci    ...
17917db96d56Sopenharmony_ci    >>> MyTest('test_something').run()
17927db96d56Sopenharmony_ci
17937db96d56Sopenharmony_ci.. caution::
17947db96d56Sopenharmony_ci
17957db96d56Sopenharmony_ci    If you use this technique you must ensure that the patching is "undone" by
17967db96d56Sopenharmony_ci    calling ``stop``. This can be fiddlier than you might think, because if an
17977db96d56Sopenharmony_ci    exception is raised in the ``setUp`` then ``tearDown`` is not called.
17987db96d56Sopenharmony_ci    :meth:`unittest.TestCase.addCleanup` makes this easier::
17997db96d56Sopenharmony_ci
18007db96d56Sopenharmony_ci        >>> class MyTest(unittest.TestCase):
18017db96d56Sopenharmony_ci        ...     def setUp(self):
18027db96d56Sopenharmony_ci        ...         patcher = patch('package.module.Class')
18037db96d56Sopenharmony_ci        ...         self.MockClass = patcher.start()
18047db96d56Sopenharmony_ci        ...         self.addCleanup(patcher.stop)
18057db96d56Sopenharmony_ci        ...
18067db96d56Sopenharmony_ci        ...     def test_something(self):
18077db96d56Sopenharmony_ci        ...         assert package.module.Class is self.MockClass
18087db96d56Sopenharmony_ci        ...
18097db96d56Sopenharmony_ci
18107db96d56Sopenharmony_ci    As an added bonus you no longer need to keep a reference to the ``patcher``
18117db96d56Sopenharmony_ci    object.
18127db96d56Sopenharmony_ci
18137db96d56Sopenharmony_ciIt is also possible to stop all patches which have been started by using
18147db96d56Sopenharmony_ci:func:`patch.stopall`.
18157db96d56Sopenharmony_ci
18167db96d56Sopenharmony_ci.. function:: patch.stopall
18177db96d56Sopenharmony_ci
18187db96d56Sopenharmony_ci    Stop all active patches. Only stops patches started with ``start``.
18197db96d56Sopenharmony_ci
18207db96d56Sopenharmony_ci
18217db96d56Sopenharmony_ci.. _patch-builtins:
18227db96d56Sopenharmony_ci
18237db96d56Sopenharmony_cipatch builtins
18247db96d56Sopenharmony_ci~~~~~~~~~~~~~~
18257db96d56Sopenharmony_ciYou can patch any builtins within a module. The following example patches
18267db96d56Sopenharmony_cibuiltin :func:`ord`::
18277db96d56Sopenharmony_ci
18287db96d56Sopenharmony_ci    >>> @patch('__main__.ord')
18297db96d56Sopenharmony_ci    ... def test(mock_ord):
18307db96d56Sopenharmony_ci    ...     mock_ord.return_value = 101
18317db96d56Sopenharmony_ci    ...     print(ord('c'))
18327db96d56Sopenharmony_ci    ...
18337db96d56Sopenharmony_ci    >>> test()
18347db96d56Sopenharmony_ci    101
18357db96d56Sopenharmony_ci
18367db96d56Sopenharmony_ci
18377db96d56Sopenharmony_ci.. _test-prefix:
18387db96d56Sopenharmony_ci
18397db96d56Sopenharmony_ciTEST_PREFIX
18407db96d56Sopenharmony_ci~~~~~~~~~~~
18417db96d56Sopenharmony_ci
18427db96d56Sopenharmony_ciAll of the patchers can be used as class decorators. When used in this way
18437db96d56Sopenharmony_cithey wrap every test method on the class. The patchers recognise methods that
18447db96d56Sopenharmony_cistart with ``'test'`` as being test methods. This is the same way that the
18457db96d56Sopenharmony_ci:class:`unittest.TestLoader` finds test methods by default.
18467db96d56Sopenharmony_ci
18477db96d56Sopenharmony_ciIt is possible that you want to use a different prefix for your tests. You can
18487db96d56Sopenharmony_ciinform the patchers of the different prefix by setting ``patch.TEST_PREFIX``::
18497db96d56Sopenharmony_ci
18507db96d56Sopenharmony_ci    >>> patch.TEST_PREFIX = 'foo'
18517db96d56Sopenharmony_ci    >>> value = 3
18527db96d56Sopenharmony_ci    >>>
18537db96d56Sopenharmony_ci    >>> @patch('__main__.value', 'not three')
18547db96d56Sopenharmony_ci    ... class Thing:
18557db96d56Sopenharmony_ci    ...     def foo_one(self):
18567db96d56Sopenharmony_ci    ...         print(value)
18577db96d56Sopenharmony_ci    ...     def foo_two(self):
18587db96d56Sopenharmony_ci    ...         print(value)
18597db96d56Sopenharmony_ci    ...
18607db96d56Sopenharmony_ci    >>>
18617db96d56Sopenharmony_ci    >>> Thing().foo_one()
18627db96d56Sopenharmony_ci    not three
18637db96d56Sopenharmony_ci    >>> Thing().foo_two()
18647db96d56Sopenharmony_ci    not three
18657db96d56Sopenharmony_ci    >>> value
18667db96d56Sopenharmony_ci    3
18677db96d56Sopenharmony_ci
18687db96d56Sopenharmony_ci
18697db96d56Sopenharmony_ciNesting Patch Decorators
18707db96d56Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~
18717db96d56Sopenharmony_ci
18727db96d56Sopenharmony_ciIf you want to perform multiple patches then you can simply stack up the
18737db96d56Sopenharmony_cidecorators.
18747db96d56Sopenharmony_ci
18757db96d56Sopenharmony_ciYou can stack up multiple patch decorators using this pattern:
18767db96d56Sopenharmony_ci
18777db96d56Sopenharmony_ci    >>> @patch.object(SomeClass, 'class_method')
18787db96d56Sopenharmony_ci    ... @patch.object(SomeClass, 'static_method')
18797db96d56Sopenharmony_ci    ... def test(mock1, mock2):
18807db96d56Sopenharmony_ci    ...     assert SomeClass.static_method is mock1
18817db96d56Sopenharmony_ci    ...     assert SomeClass.class_method is mock2
18827db96d56Sopenharmony_ci    ...     SomeClass.static_method('foo')
18837db96d56Sopenharmony_ci    ...     SomeClass.class_method('bar')
18847db96d56Sopenharmony_ci    ...     return mock1, mock2
18857db96d56Sopenharmony_ci    ...
18867db96d56Sopenharmony_ci    >>> mock1, mock2 = test()
18877db96d56Sopenharmony_ci    >>> mock1.assert_called_once_with('foo')
18887db96d56Sopenharmony_ci    >>> mock2.assert_called_once_with('bar')
18897db96d56Sopenharmony_ci
18907db96d56Sopenharmony_ci
18917db96d56Sopenharmony_ciNote that the decorators are applied from the bottom upwards. This is the
18927db96d56Sopenharmony_cistandard way that Python applies decorators. The order of the created mocks
18937db96d56Sopenharmony_cipassed into your test function matches this order.
18947db96d56Sopenharmony_ci
18957db96d56Sopenharmony_ci
18967db96d56Sopenharmony_ci.. _where-to-patch:
18977db96d56Sopenharmony_ci
18987db96d56Sopenharmony_ciWhere to patch
18997db96d56Sopenharmony_ci~~~~~~~~~~~~~~
19007db96d56Sopenharmony_ci
19017db96d56Sopenharmony_ci:func:`patch` works by (temporarily) changing the object that a *name* points to with
19027db96d56Sopenharmony_cianother one. There can be many names pointing to any individual object, so
19037db96d56Sopenharmony_cifor patching to work you must ensure that you patch the name used by the system
19047db96d56Sopenharmony_ciunder test.
19057db96d56Sopenharmony_ci
19067db96d56Sopenharmony_ciThe basic principle is that you patch where an object is *looked up*, which
19077db96d56Sopenharmony_ciis not necessarily the same place as where it is defined. A couple of
19087db96d56Sopenharmony_ciexamples will help to clarify this.
19097db96d56Sopenharmony_ci
19107db96d56Sopenharmony_ciImagine we have a project that we want to test with the following structure::
19117db96d56Sopenharmony_ci
19127db96d56Sopenharmony_ci    a.py
19137db96d56Sopenharmony_ci        -> Defines SomeClass
19147db96d56Sopenharmony_ci
19157db96d56Sopenharmony_ci    b.py
19167db96d56Sopenharmony_ci        -> from a import SomeClass
19177db96d56Sopenharmony_ci        -> some_function instantiates SomeClass
19187db96d56Sopenharmony_ci
19197db96d56Sopenharmony_ciNow we want to test ``some_function`` but we want to mock out ``SomeClass`` using
19207db96d56Sopenharmony_ci:func:`patch`. The problem is that when we import module b, which we will have to
19217db96d56Sopenharmony_cido then it imports ``SomeClass`` from module a. If we use :func:`patch` to mock out
19227db96d56Sopenharmony_ci``a.SomeClass`` then it will have no effect on our test; module b already has a
19237db96d56Sopenharmony_cireference to the *real* ``SomeClass`` and it looks like our patching had no
19247db96d56Sopenharmony_cieffect.
19257db96d56Sopenharmony_ci
19267db96d56Sopenharmony_ciThe key is to patch out ``SomeClass`` where it is used (or where it is looked up).
19277db96d56Sopenharmony_ciIn this case ``some_function`` will actually look up ``SomeClass`` in module b,
19287db96d56Sopenharmony_ciwhere we have imported it. The patching should look like::
19297db96d56Sopenharmony_ci
19307db96d56Sopenharmony_ci    @patch('b.SomeClass')
19317db96d56Sopenharmony_ci
19327db96d56Sopenharmony_ciHowever, consider the alternative scenario where instead of ``from a import
19337db96d56Sopenharmony_ciSomeClass`` module b does ``import a`` and ``some_function`` uses ``a.SomeClass``. Both
19347db96d56Sopenharmony_ciof these import forms are common. In this case the class we want to patch is
19357db96d56Sopenharmony_cibeing looked up in the module and so we have to patch ``a.SomeClass`` instead::
19367db96d56Sopenharmony_ci
19377db96d56Sopenharmony_ci    @patch('a.SomeClass')
19387db96d56Sopenharmony_ci
19397db96d56Sopenharmony_ci
19407db96d56Sopenharmony_ciPatching Descriptors and Proxy Objects
19417db96d56Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19427db96d56Sopenharmony_ci
19437db96d56Sopenharmony_ciBoth patch_ and patch.object_ correctly patch and restore descriptors: class
19447db96d56Sopenharmony_cimethods, static methods and properties. You should patch these on the *class*
19457db96d56Sopenharmony_cirather than an instance. They also work with *some* objects
19467db96d56Sopenharmony_cithat proxy attribute access, like the `django settings object
19477db96d56Sopenharmony_ci<https://web.archive.org/web/20200603181648/http://www.voidspace.org.uk/python/weblog/arch_d7_2010_12_04.shtml#e1198>`_.
19487db96d56Sopenharmony_ci
19497db96d56Sopenharmony_ci
19507db96d56Sopenharmony_ciMagicMock and magic method support
19517db96d56Sopenharmony_ci----------------------------------
19527db96d56Sopenharmony_ci
19537db96d56Sopenharmony_ci.. _magic-methods:
19547db96d56Sopenharmony_ci
19557db96d56Sopenharmony_ciMocking Magic Methods
19567db96d56Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~
19577db96d56Sopenharmony_ci
19587db96d56Sopenharmony_ci:class:`Mock` supports mocking the Python protocol methods, also known as
19597db96d56Sopenharmony_ci"magic methods". This allows mock objects to replace containers or other
19607db96d56Sopenharmony_ciobjects that implement Python protocols.
19617db96d56Sopenharmony_ci
19627db96d56Sopenharmony_ciBecause magic methods are looked up differently from normal methods [#]_, this
19637db96d56Sopenharmony_cisupport has been specially implemented. This means that only specific magic
19647db96d56Sopenharmony_cimethods are supported. The supported list includes *almost* all of them. If
19657db96d56Sopenharmony_cithere are any missing that you need please let us know.
19667db96d56Sopenharmony_ci
19677db96d56Sopenharmony_ciYou mock magic methods by setting the method you are interested in to a function
19687db96d56Sopenharmony_cior a mock instance. If you are using a function then it *must* take ``self`` as
19697db96d56Sopenharmony_cithe first argument [#]_.
19707db96d56Sopenharmony_ci
19717db96d56Sopenharmony_ci   >>> def __str__(self):
19727db96d56Sopenharmony_ci   ...     return 'fooble'
19737db96d56Sopenharmony_ci   ...
19747db96d56Sopenharmony_ci   >>> mock = Mock()
19757db96d56Sopenharmony_ci   >>> mock.__str__ = __str__
19767db96d56Sopenharmony_ci   >>> str(mock)
19777db96d56Sopenharmony_ci   'fooble'
19787db96d56Sopenharmony_ci
19797db96d56Sopenharmony_ci   >>> mock = Mock()
19807db96d56Sopenharmony_ci   >>> mock.__str__ = Mock()
19817db96d56Sopenharmony_ci   >>> mock.__str__.return_value = 'fooble'
19827db96d56Sopenharmony_ci   >>> str(mock)
19837db96d56Sopenharmony_ci   'fooble'
19847db96d56Sopenharmony_ci
19857db96d56Sopenharmony_ci   >>> mock = Mock()
19867db96d56Sopenharmony_ci   >>> mock.__iter__ = Mock(return_value=iter([]))
19877db96d56Sopenharmony_ci   >>> list(mock)
19887db96d56Sopenharmony_ci   []
19897db96d56Sopenharmony_ci
19907db96d56Sopenharmony_ciOne use case for this is for mocking objects used as context managers in a
19917db96d56Sopenharmony_ci:keyword:`with` statement:
19927db96d56Sopenharmony_ci
19937db96d56Sopenharmony_ci   >>> mock = Mock()
19947db96d56Sopenharmony_ci   >>> mock.__enter__ = Mock(return_value='foo')
19957db96d56Sopenharmony_ci   >>> mock.__exit__ = Mock(return_value=False)
19967db96d56Sopenharmony_ci   >>> with mock as m:
19977db96d56Sopenharmony_ci   ...     assert m == 'foo'
19987db96d56Sopenharmony_ci   ...
19997db96d56Sopenharmony_ci   >>> mock.__enter__.assert_called_with()
20007db96d56Sopenharmony_ci   >>> mock.__exit__.assert_called_with(None, None, None)
20017db96d56Sopenharmony_ci
20027db96d56Sopenharmony_ciCalls to magic methods do not appear in :attr:`~Mock.method_calls`, but they
20037db96d56Sopenharmony_ciare recorded in :attr:`~Mock.mock_calls`.
20047db96d56Sopenharmony_ci
20057db96d56Sopenharmony_ci.. note::
20067db96d56Sopenharmony_ci
20077db96d56Sopenharmony_ci   If you use the *spec* keyword argument to create a mock then attempting to
20087db96d56Sopenharmony_ci   set a magic method that isn't in the spec will raise an :exc:`AttributeError`.
20097db96d56Sopenharmony_ci
20107db96d56Sopenharmony_ciThe full list of supported magic methods is:
20117db96d56Sopenharmony_ci
20127db96d56Sopenharmony_ci* ``__hash__``, ``__sizeof__``, ``__repr__`` and ``__str__``
20137db96d56Sopenharmony_ci* ``__dir__``, ``__format__`` and ``__subclasses__``
20147db96d56Sopenharmony_ci* ``__round__``, ``__floor__``, ``__trunc__`` and ``__ceil__``
20157db96d56Sopenharmony_ci* Comparisons: ``__lt__``, ``__gt__``, ``__le__``, ``__ge__``,
20167db96d56Sopenharmony_ci  ``__eq__`` and ``__ne__``
20177db96d56Sopenharmony_ci* Container methods: ``__getitem__``, ``__setitem__``, ``__delitem__``,
20187db96d56Sopenharmony_ci  ``__contains__``, ``__len__``, ``__iter__``, ``__reversed__``
20197db96d56Sopenharmony_ci  and ``__missing__``
20207db96d56Sopenharmony_ci* Context manager: ``__enter__``, ``__exit__``, ``__aenter__`` and ``__aexit__``
20217db96d56Sopenharmony_ci* Unary numeric methods: ``__neg__``, ``__pos__`` and ``__invert__``
20227db96d56Sopenharmony_ci* The numeric methods (including right hand and in-place variants):
20237db96d56Sopenharmony_ci  ``__add__``, ``__sub__``, ``__mul__``, ``__matmul__``, ``__truediv__``,
20247db96d56Sopenharmony_ci  ``__floordiv__``, ``__mod__``, ``__divmod__``, ``__lshift__``,
20257db96d56Sopenharmony_ci  ``__rshift__``, ``__and__``, ``__xor__``, ``__or__``, and ``__pow__``
20267db96d56Sopenharmony_ci* Numeric conversion methods: ``__complex__``, ``__int__``, ``__float__``
20277db96d56Sopenharmony_ci  and ``__index__``
20287db96d56Sopenharmony_ci* Descriptor methods: ``__get__``, ``__set__`` and ``__delete__``
20297db96d56Sopenharmony_ci* Pickling: ``__reduce__``, ``__reduce_ex__``, ``__getinitargs__``,
20307db96d56Sopenharmony_ci  ``__getnewargs__``, ``__getstate__`` and ``__setstate__``
20317db96d56Sopenharmony_ci* File system path representation: ``__fspath__``
20327db96d56Sopenharmony_ci* Asynchronous iteration methods: ``__aiter__`` and ``__anext__``
20337db96d56Sopenharmony_ci
20347db96d56Sopenharmony_ci.. versionchanged:: 3.8
20357db96d56Sopenharmony_ci   Added support for :func:`os.PathLike.__fspath__`.
20367db96d56Sopenharmony_ci
20377db96d56Sopenharmony_ci.. versionchanged:: 3.8
20387db96d56Sopenharmony_ci   Added support for ``__aenter__``, ``__aexit__``, ``__aiter__`` and ``__anext__``.
20397db96d56Sopenharmony_ci
20407db96d56Sopenharmony_ci
20417db96d56Sopenharmony_ciThe following methods exist but are *not* supported as they are either in use
20427db96d56Sopenharmony_ciby mock, can't be set dynamically, or can cause problems:
20437db96d56Sopenharmony_ci
20447db96d56Sopenharmony_ci* ``__getattr__``, ``__setattr__``, ``__init__`` and ``__new__``
20457db96d56Sopenharmony_ci* ``__prepare__``, ``__instancecheck__``, ``__subclasscheck__``, ``__del__``
20467db96d56Sopenharmony_ci
20477db96d56Sopenharmony_ci
20487db96d56Sopenharmony_ci
20497db96d56Sopenharmony_ciMagic Mock
20507db96d56Sopenharmony_ci~~~~~~~~~~
20517db96d56Sopenharmony_ci
20527db96d56Sopenharmony_ciThere are two ``MagicMock`` variants: :class:`MagicMock` and :class:`NonCallableMagicMock`.
20537db96d56Sopenharmony_ci
20547db96d56Sopenharmony_ci
20557db96d56Sopenharmony_ci.. class:: MagicMock(*args, **kw)
20567db96d56Sopenharmony_ci
20577db96d56Sopenharmony_ci   ``MagicMock`` is a subclass of :class:`Mock` with default implementations
20587db96d56Sopenharmony_ci   of most of the magic methods. You can use ``MagicMock`` without having to
20597db96d56Sopenharmony_ci   configure the magic methods yourself.
20607db96d56Sopenharmony_ci
20617db96d56Sopenharmony_ci   The constructor parameters have the same meaning as for :class:`Mock`.
20627db96d56Sopenharmony_ci
20637db96d56Sopenharmony_ci   If you use the *spec* or *spec_set* arguments then *only* magic methods
20647db96d56Sopenharmony_ci   that exist in the spec will be created.
20657db96d56Sopenharmony_ci
20667db96d56Sopenharmony_ci
20677db96d56Sopenharmony_ci.. class:: NonCallableMagicMock(*args, **kw)
20687db96d56Sopenharmony_ci
20697db96d56Sopenharmony_ci    A non-callable version of :class:`MagicMock`.
20707db96d56Sopenharmony_ci
20717db96d56Sopenharmony_ci    The constructor parameters have the same meaning as for
20727db96d56Sopenharmony_ci    :class:`MagicMock`, with the exception of *return_value* and
20737db96d56Sopenharmony_ci    *side_effect* which have no meaning on a non-callable mock.
20747db96d56Sopenharmony_ci
20757db96d56Sopenharmony_ciThe magic methods are setup with :class:`MagicMock` objects, so you can configure them
20767db96d56Sopenharmony_ciand use them in the usual way:
20777db96d56Sopenharmony_ci
20787db96d56Sopenharmony_ci   >>> mock = MagicMock()
20797db96d56Sopenharmony_ci   >>> mock[3] = 'fish'
20807db96d56Sopenharmony_ci   >>> mock.__setitem__.assert_called_with(3, 'fish')
20817db96d56Sopenharmony_ci   >>> mock.__getitem__.return_value = 'result'
20827db96d56Sopenharmony_ci   >>> mock[2]
20837db96d56Sopenharmony_ci   'result'
20847db96d56Sopenharmony_ci
20857db96d56Sopenharmony_ciBy default many of the protocol methods are required to return objects of a
20867db96d56Sopenharmony_cispecific type. These methods are preconfigured with a default return value, so
20877db96d56Sopenharmony_cithat they can be used without you having to do anything if you aren't interested
20887db96d56Sopenharmony_ciin the return value. You can still *set* the return value manually if you want
20897db96d56Sopenharmony_cito change the default.
20907db96d56Sopenharmony_ci
20917db96d56Sopenharmony_ciMethods and their defaults:
20927db96d56Sopenharmony_ci
20937db96d56Sopenharmony_ci* ``__lt__``: ``NotImplemented``
20947db96d56Sopenharmony_ci* ``__gt__``: ``NotImplemented``
20957db96d56Sopenharmony_ci* ``__le__``: ``NotImplemented``
20967db96d56Sopenharmony_ci* ``__ge__``: ``NotImplemented``
20977db96d56Sopenharmony_ci* ``__int__``: ``1``
20987db96d56Sopenharmony_ci* ``__contains__``: ``False``
20997db96d56Sopenharmony_ci* ``__len__``: ``0``
21007db96d56Sopenharmony_ci* ``__iter__``: ``iter([])``
21017db96d56Sopenharmony_ci* ``__exit__``: ``False``
21027db96d56Sopenharmony_ci* ``__aexit__``: ``False``
21037db96d56Sopenharmony_ci* ``__complex__``: ``1j``
21047db96d56Sopenharmony_ci* ``__float__``: ``1.0``
21057db96d56Sopenharmony_ci* ``__bool__``: ``True``
21067db96d56Sopenharmony_ci* ``__index__``: ``1``
21077db96d56Sopenharmony_ci* ``__hash__``: default hash for the mock
21087db96d56Sopenharmony_ci* ``__str__``: default str for the mock
21097db96d56Sopenharmony_ci* ``__sizeof__``: default sizeof for the mock
21107db96d56Sopenharmony_ci
21117db96d56Sopenharmony_ciFor example:
21127db96d56Sopenharmony_ci
21137db96d56Sopenharmony_ci   >>> mock = MagicMock()
21147db96d56Sopenharmony_ci   >>> int(mock)
21157db96d56Sopenharmony_ci   1
21167db96d56Sopenharmony_ci   >>> len(mock)
21177db96d56Sopenharmony_ci   0
21187db96d56Sopenharmony_ci   >>> list(mock)
21197db96d56Sopenharmony_ci   []
21207db96d56Sopenharmony_ci   >>> object() in mock
21217db96d56Sopenharmony_ci   False
21227db96d56Sopenharmony_ci
21237db96d56Sopenharmony_ciThe two equality methods, :meth:`__eq__` and :meth:`__ne__`, are special.
21247db96d56Sopenharmony_ciThey do the default equality comparison on identity, using the
21257db96d56Sopenharmony_ci:attr:`~Mock.side_effect` attribute, unless you change their return value to
21267db96d56Sopenharmony_cireturn something else::
21277db96d56Sopenharmony_ci
21287db96d56Sopenharmony_ci   >>> MagicMock() == 3
21297db96d56Sopenharmony_ci   False
21307db96d56Sopenharmony_ci   >>> MagicMock() != 3
21317db96d56Sopenharmony_ci   True
21327db96d56Sopenharmony_ci   >>> mock = MagicMock()
21337db96d56Sopenharmony_ci   >>> mock.__eq__.return_value = True
21347db96d56Sopenharmony_ci   >>> mock == 3
21357db96d56Sopenharmony_ci   True
21367db96d56Sopenharmony_ci
21377db96d56Sopenharmony_ciThe return value of :meth:`MagicMock.__iter__` can be any iterable object and isn't
21387db96d56Sopenharmony_cirequired to be an iterator:
21397db96d56Sopenharmony_ci
21407db96d56Sopenharmony_ci   >>> mock = MagicMock()
21417db96d56Sopenharmony_ci   >>> mock.__iter__.return_value = ['a', 'b', 'c']
21427db96d56Sopenharmony_ci   >>> list(mock)
21437db96d56Sopenharmony_ci   ['a', 'b', 'c']
21447db96d56Sopenharmony_ci   >>> list(mock)
21457db96d56Sopenharmony_ci   ['a', 'b', 'c']
21467db96d56Sopenharmony_ci
21477db96d56Sopenharmony_ciIf the return value *is* an iterator, then iterating over it once will consume
21487db96d56Sopenharmony_ciit and subsequent iterations will result in an empty list:
21497db96d56Sopenharmony_ci
21507db96d56Sopenharmony_ci   >>> mock.__iter__.return_value = iter(['a', 'b', 'c'])
21517db96d56Sopenharmony_ci   >>> list(mock)
21527db96d56Sopenharmony_ci   ['a', 'b', 'c']
21537db96d56Sopenharmony_ci   >>> list(mock)
21547db96d56Sopenharmony_ci   []
21557db96d56Sopenharmony_ci
21567db96d56Sopenharmony_ci``MagicMock`` has all of the supported magic methods configured except for some
21577db96d56Sopenharmony_ciof the obscure and obsolete ones. You can still set these up if you want.
21587db96d56Sopenharmony_ci
21597db96d56Sopenharmony_ciMagic methods that are supported but not setup by default in ``MagicMock`` are:
21607db96d56Sopenharmony_ci
21617db96d56Sopenharmony_ci* ``__subclasses__``
21627db96d56Sopenharmony_ci* ``__dir__``
21637db96d56Sopenharmony_ci* ``__format__``
21647db96d56Sopenharmony_ci* ``__get__``, ``__set__`` and ``__delete__``
21657db96d56Sopenharmony_ci* ``__reversed__`` and ``__missing__``
21667db96d56Sopenharmony_ci* ``__reduce__``, ``__reduce_ex__``, ``__getinitargs__``, ``__getnewargs__``,
21677db96d56Sopenharmony_ci  ``__getstate__`` and ``__setstate__``
21687db96d56Sopenharmony_ci* ``__getformat__``
21697db96d56Sopenharmony_ci
21707db96d56Sopenharmony_ci
21717db96d56Sopenharmony_ci
21727db96d56Sopenharmony_ci.. [#] Magic methods *should* be looked up on the class rather than the
21737db96d56Sopenharmony_ci   instance. Different versions of Python are inconsistent about applying this
21747db96d56Sopenharmony_ci   rule. The supported protocol methods should work with all supported versions
21757db96d56Sopenharmony_ci   of Python.
21767db96d56Sopenharmony_ci.. [#] The function is basically hooked up to the class, but each ``Mock``
21777db96d56Sopenharmony_ci   instance is kept isolated from the others.
21787db96d56Sopenharmony_ci
21797db96d56Sopenharmony_ci
21807db96d56Sopenharmony_ciHelpers
21817db96d56Sopenharmony_ci-------
21827db96d56Sopenharmony_ci
21837db96d56Sopenharmony_cisentinel
21847db96d56Sopenharmony_ci~~~~~~~~
21857db96d56Sopenharmony_ci
21867db96d56Sopenharmony_ci.. data:: sentinel
21877db96d56Sopenharmony_ci
21887db96d56Sopenharmony_ci   The ``sentinel`` object provides a convenient way of providing unique
21897db96d56Sopenharmony_ci   objects for your tests.
21907db96d56Sopenharmony_ci
21917db96d56Sopenharmony_ci   Attributes are created on demand when you access them by name. Accessing
21927db96d56Sopenharmony_ci   the same attribute will always return the same object. The objects
21937db96d56Sopenharmony_ci   returned have a sensible repr so that test failure messages are readable.
21947db96d56Sopenharmony_ci
21957db96d56Sopenharmony_ci   .. versionchanged:: 3.7
21967db96d56Sopenharmony_ci      The ``sentinel`` attributes now preserve their identity when they are
21977db96d56Sopenharmony_ci      :mod:`copied <copy>` or :mod:`pickled <pickle>`.
21987db96d56Sopenharmony_ci
21997db96d56Sopenharmony_ciSometimes when testing you need to test that a specific object is passed as an
22007db96d56Sopenharmony_ciargument to another method, or returned. It can be common to create named
22017db96d56Sopenharmony_cisentinel objects to test this. :data:`sentinel` provides a convenient way of
22027db96d56Sopenharmony_cicreating and testing the identity of objects like this.
22037db96d56Sopenharmony_ci
22047db96d56Sopenharmony_ciIn this example we monkey patch ``method`` to return ``sentinel.some_object``:
22057db96d56Sopenharmony_ci
22067db96d56Sopenharmony_ci    >>> real = ProductionClass()
22077db96d56Sopenharmony_ci    >>> real.method = Mock(name="method")
22087db96d56Sopenharmony_ci    >>> real.method.return_value = sentinel.some_object
22097db96d56Sopenharmony_ci    >>> result = real.method()
22107db96d56Sopenharmony_ci    >>> assert result is sentinel.some_object
22117db96d56Sopenharmony_ci    >>> result
22127db96d56Sopenharmony_ci    sentinel.some_object
22137db96d56Sopenharmony_ci
22147db96d56Sopenharmony_ci
22157db96d56Sopenharmony_ciDEFAULT
22167db96d56Sopenharmony_ci~~~~~~~
22177db96d56Sopenharmony_ci
22187db96d56Sopenharmony_ci
22197db96d56Sopenharmony_ci.. data:: DEFAULT
22207db96d56Sopenharmony_ci
22217db96d56Sopenharmony_ci    The :data:`DEFAULT` object is a pre-created sentinel (actually
22227db96d56Sopenharmony_ci    ``sentinel.DEFAULT``). It can be used by :attr:`~Mock.side_effect`
22237db96d56Sopenharmony_ci    functions to indicate that the normal return value should be used.
22247db96d56Sopenharmony_ci
22257db96d56Sopenharmony_ci
22267db96d56Sopenharmony_cicall
22277db96d56Sopenharmony_ci~~~~
22287db96d56Sopenharmony_ci
22297db96d56Sopenharmony_ci.. function:: call(*args, **kwargs)
22307db96d56Sopenharmony_ci
22317db96d56Sopenharmony_ci    :func:`call` is a helper object for making simpler assertions, for comparing with
22327db96d56Sopenharmony_ci    :attr:`~Mock.call_args`, :attr:`~Mock.call_args_list`,
22337db96d56Sopenharmony_ci    :attr:`~Mock.mock_calls` and :attr:`~Mock.method_calls`. :func:`call` can also be
22347db96d56Sopenharmony_ci    used with :meth:`~Mock.assert_has_calls`.
22357db96d56Sopenharmony_ci
22367db96d56Sopenharmony_ci        >>> m = MagicMock(return_value=None)
22377db96d56Sopenharmony_ci        >>> m(1, 2, a='foo', b='bar')
22387db96d56Sopenharmony_ci        >>> m()
22397db96d56Sopenharmony_ci        >>> m.call_args_list == [call(1, 2, a='foo', b='bar'), call()]
22407db96d56Sopenharmony_ci        True
22417db96d56Sopenharmony_ci
22427db96d56Sopenharmony_ci.. method:: call.call_list()
22437db96d56Sopenharmony_ci
22447db96d56Sopenharmony_ci    For a call object that represents multiple calls, :meth:`call_list`
22457db96d56Sopenharmony_ci    returns a list of all the intermediate calls as well as the
22467db96d56Sopenharmony_ci    final call.
22477db96d56Sopenharmony_ci
22487db96d56Sopenharmony_ci``call_list`` is particularly useful for making assertions on "chained calls". A
22497db96d56Sopenharmony_cichained call is multiple calls on a single line of code. This results in
22507db96d56Sopenharmony_cimultiple entries in :attr:`~Mock.mock_calls` on a mock. Manually constructing
22517db96d56Sopenharmony_cithe sequence of calls can be tedious.
22527db96d56Sopenharmony_ci
22537db96d56Sopenharmony_ci:meth:`~call.call_list` can construct the sequence of calls from the same
22547db96d56Sopenharmony_cichained call:
22557db96d56Sopenharmony_ci
22567db96d56Sopenharmony_ci    >>> m = MagicMock()
22577db96d56Sopenharmony_ci    >>> m(1).method(arg='foo').other('bar')(2.0)
22587db96d56Sopenharmony_ci    <MagicMock name='mock().method().other()()' id='...'>
22597db96d56Sopenharmony_ci    >>> kall = call(1).method(arg='foo').other('bar')(2.0)
22607db96d56Sopenharmony_ci    >>> kall.call_list()
22617db96d56Sopenharmony_ci    [call(1),
22627db96d56Sopenharmony_ci     call().method(arg='foo'),
22637db96d56Sopenharmony_ci     call().method().other('bar'),
22647db96d56Sopenharmony_ci     call().method().other()(2.0)]
22657db96d56Sopenharmony_ci    >>> m.mock_calls == kall.call_list()
22667db96d56Sopenharmony_ci    True
22677db96d56Sopenharmony_ci
22687db96d56Sopenharmony_ci.. _calls-as-tuples:
22697db96d56Sopenharmony_ci
22707db96d56Sopenharmony_ciA ``call`` object is either a tuple of (positional args, keyword args) or
22717db96d56Sopenharmony_ci(name, positional args, keyword args) depending on how it was constructed. When
22727db96d56Sopenharmony_ciyou construct them yourself this isn't particularly interesting, but the ``call``
22737db96d56Sopenharmony_ciobjects that are in the :attr:`Mock.call_args`, :attr:`Mock.call_args_list` and
22747db96d56Sopenharmony_ci:attr:`Mock.mock_calls` attributes can be introspected to get at the individual
22757db96d56Sopenharmony_ciarguments they contain.
22767db96d56Sopenharmony_ci
22777db96d56Sopenharmony_ciThe ``call`` objects in :attr:`Mock.call_args` and :attr:`Mock.call_args_list`
22787db96d56Sopenharmony_ciare two-tuples of (positional args, keyword args) whereas the ``call`` objects
22797db96d56Sopenharmony_ciin :attr:`Mock.mock_calls`, along with ones you construct yourself, are
22807db96d56Sopenharmony_cithree-tuples of (name, positional args, keyword args).
22817db96d56Sopenharmony_ci
22827db96d56Sopenharmony_ciYou can use their "tupleness" to pull out the individual arguments for more
22837db96d56Sopenharmony_cicomplex introspection and assertions. The positional arguments are a tuple
22847db96d56Sopenharmony_ci(an empty tuple if there are no positional arguments) and the keyword
22857db96d56Sopenharmony_ciarguments are a dictionary:
22867db96d56Sopenharmony_ci
22877db96d56Sopenharmony_ci    >>> m = MagicMock(return_value=None)
22887db96d56Sopenharmony_ci    >>> m(1, 2, 3, arg='one', arg2='two')
22897db96d56Sopenharmony_ci    >>> kall = m.call_args
22907db96d56Sopenharmony_ci    >>> kall.args
22917db96d56Sopenharmony_ci    (1, 2, 3)
22927db96d56Sopenharmony_ci    >>> kall.kwargs
22937db96d56Sopenharmony_ci    {'arg': 'one', 'arg2': 'two'}
22947db96d56Sopenharmony_ci    >>> kall.args is kall[0]
22957db96d56Sopenharmony_ci    True
22967db96d56Sopenharmony_ci    >>> kall.kwargs is kall[1]
22977db96d56Sopenharmony_ci    True
22987db96d56Sopenharmony_ci
22997db96d56Sopenharmony_ci    >>> m = MagicMock()
23007db96d56Sopenharmony_ci    >>> m.foo(4, 5, 6, arg='two', arg2='three')
23017db96d56Sopenharmony_ci    <MagicMock name='mock.foo()' id='...'>
23027db96d56Sopenharmony_ci    >>> kall = m.mock_calls[0]
23037db96d56Sopenharmony_ci    >>> name, args, kwargs = kall
23047db96d56Sopenharmony_ci    >>> name
23057db96d56Sopenharmony_ci    'foo'
23067db96d56Sopenharmony_ci    >>> args
23077db96d56Sopenharmony_ci    (4, 5, 6)
23087db96d56Sopenharmony_ci    >>> kwargs
23097db96d56Sopenharmony_ci    {'arg': 'two', 'arg2': 'three'}
23107db96d56Sopenharmony_ci    >>> name is m.mock_calls[0][0]
23117db96d56Sopenharmony_ci    True
23127db96d56Sopenharmony_ci
23137db96d56Sopenharmony_ci
23147db96d56Sopenharmony_cicreate_autospec
23157db96d56Sopenharmony_ci~~~~~~~~~~~~~~~
23167db96d56Sopenharmony_ci
23177db96d56Sopenharmony_ci.. function:: create_autospec(spec, spec_set=False, instance=False, **kwargs)
23187db96d56Sopenharmony_ci
23197db96d56Sopenharmony_ci    Create a mock object using another object as a spec. Attributes on the
23207db96d56Sopenharmony_ci    mock will use the corresponding attribute on the *spec* object as their
23217db96d56Sopenharmony_ci    spec.
23227db96d56Sopenharmony_ci
23237db96d56Sopenharmony_ci    Functions or methods being mocked will have their arguments checked to
23247db96d56Sopenharmony_ci    ensure that they are called with the correct signature.
23257db96d56Sopenharmony_ci
23267db96d56Sopenharmony_ci    If *spec_set* is ``True`` then attempting to set attributes that don't exist
23277db96d56Sopenharmony_ci    on the spec object will raise an :exc:`AttributeError`.
23287db96d56Sopenharmony_ci
23297db96d56Sopenharmony_ci    If a class is used as a spec then the return value of the mock (the
23307db96d56Sopenharmony_ci    instance of the class) will have the same spec. You can use a class as the
23317db96d56Sopenharmony_ci    spec for an instance object by passing ``instance=True``. The returned mock
23327db96d56Sopenharmony_ci    will only be callable if instances of the mock are callable.
23337db96d56Sopenharmony_ci
23347db96d56Sopenharmony_ci    :func:`create_autospec` also takes arbitrary keyword arguments that are passed to
23357db96d56Sopenharmony_ci    the constructor of the created mock.
23367db96d56Sopenharmony_ci
23377db96d56Sopenharmony_ciSee :ref:`auto-speccing` for examples of how to use auto-speccing with
23387db96d56Sopenharmony_ci:func:`create_autospec` and the *autospec* argument to :func:`patch`.
23397db96d56Sopenharmony_ci
23407db96d56Sopenharmony_ci
23417db96d56Sopenharmony_ci.. versionchanged:: 3.8
23427db96d56Sopenharmony_ci
23437db96d56Sopenharmony_ci    :func:`create_autospec` now returns an :class:`AsyncMock` if the target is
23447db96d56Sopenharmony_ci    an async function.
23457db96d56Sopenharmony_ci
23467db96d56Sopenharmony_ci
23477db96d56Sopenharmony_ciANY
23487db96d56Sopenharmony_ci~~~
23497db96d56Sopenharmony_ci
23507db96d56Sopenharmony_ci.. data:: ANY
23517db96d56Sopenharmony_ci
23527db96d56Sopenharmony_ciSometimes you may need to make assertions about *some* of the arguments in a
23537db96d56Sopenharmony_cicall to mock, but either not care about some of the arguments or want to pull
23547db96d56Sopenharmony_cithem individually out of :attr:`~Mock.call_args` and make more complex
23557db96d56Sopenharmony_ciassertions on them.
23567db96d56Sopenharmony_ci
23577db96d56Sopenharmony_ciTo ignore certain arguments you can pass in objects that compare equal to
23587db96d56Sopenharmony_ci*everything*. Calls to :meth:`~Mock.assert_called_with` and
23597db96d56Sopenharmony_ci:meth:`~Mock.assert_called_once_with` will then succeed no matter what was
23607db96d56Sopenharmony_cipassed in.
23617db96d56Sopenharmony_ci
23627db96d56Sopenharmony_ci    >>> mock = Mock(return_value=None)
23637db96d56Sopenharmony_ci    >>> mock('foo', bar=object())
23647db96d56Sopenharmony_ci    >>> mock.assert_called_once_with('foo', bar=ANY)
23657db96d56Sopenharmony_ci
23667db96d56Sopenharmony_ci:data:`ANY` can also be used in comparisons with call lists like
23677db96d56Sopenharmony_ci:attr:`~Mock.mock_calls`:
23687db96d56Sopenharmony_ci
23697db96d56Sopenharmony_ci    >>> m = MagicMock(return_value=None)
23707db96d56Sopenharmony_ci    >>> m(1)
23717db96d56Sopenharmony_ci    >>> m(1, 2)
23727db96d56Sopenharmony_ci    >>> m(object())
23737db96d56Sopenharmony_ci    >>> m.mock_calls == [call(1), call(1, 2), ANY]
23747db96d56Sopenharmony_ci    True
23757db96d56Sopenharmony_ci
23767db96d56Sopenharmony_ci
23777db96d56Sopenharmony_ci
23787db96d56Sopenharmony_ciFILTER_DIR
23797db96d56Sopenharmony_ci~~~~~~~~~~
23807db96d56Sopenharmony_ci
23817db96d56Sopenharmony_ci.. data:: FILTER_DIR
23827db96d56Sopenharmony_ci
23837db96d56Sopenharmony_ci:data:`FILTER_DIR` is a module level variable that controls the way mock objects
23847db96d56Sopenharmony_cirespond to :func:`dir`. The default is ``True``,
23857db96d56Sopenharmony_ciwhich uses the filtering described below, to only show useful members. If you
23867db96d56Sopenharmony_cidislike this filtering, or need to switch it off for diagnostic purposes, then
23877db96d56Sopenharmony_ciset ``mock.FILTER_DIR = False``.
23887db96d56Sopenharmony_ci
23897db96d56Sopenharmony_ciWith filtering on, ``dir(some_mock)`` shows only useful attributes and will
23907db96d56Sopenharmony_ciinclude any dynamically created attributes that wouldn't normally be shown.
23917db96d56Sopenharmony_ciIf the mock was created with a *spec* (or *autospec* of course) then all the
23927db96d56Sopenharmony_ciattributes from the original are shown, even if they haven't been accessed
23937db96d56Sopenharmony_ciyet:
23947db96d56Sopenharmony_ci
23957db96d56Sopenharmony_ci.. doctest::
23967db96d56Sopenharmony_ci    :options: +ELLIPSIS,+NORMALIZE_WHITESPACE
23977db96d56Sopenharmony_ci
23987db96d56Sopenharmony_ci    >>> dir(Mock())
23997db96d56Sopenharmony_ci    ['assert_any_call',
24007db96d56Sopenharmony_ci     'assert_called',
24017db96d56Sopenharmony_ci     'assert_called_once',
24027db96d56Sopenharmony_ci     'assert_called_once_with',
24037db96d56Sopenharmony_ci     'assert_called_with',
24047db96d56Sopenharmony_ci     'assert_has_calls',
24057db96d56Sopenharmony_ci     'assert_not_called',
24067db96d56Sopenharmony_ci     'attach_mock',
24077db96d56Sopenharmony_ci     ...
24087db96d56Sopenharmony_ci    >>> from urllib import request
24097db96d56Sopenharmony_ci    >>> dir(Mock(spec=request))
24107db96d56Sopenharmony_ci    ['AbstractBasicAuthHandler',
24117db96d56Sopenharmony_ci     'AbstractDigestAuthHandler',
24127db96d56Sopenharmony_ci     'AbstractHTTPHandler',
24137db96d56Sopenharmony_ci     'BaseHandler',
24147db96d56Sopenharmony_ci     ...
24157db96d56Sopenharmony_ci
24167db96d56Sopenharmony_ciMany of the not-very-useful (private to :class:`Mock` rather than the thing being
24177db96d56Sopenharmony_cimocked) underscore and double underscore prefixed attributes have been
24187db96d56Sopenharmony_cifiltered from the result of calling :func:`dir` on a :class:`Mock`. If you dislike this
24197db96d56Sopenharmony_cibehaviour you can switch it off by setting the module level switch
24207db96d56Sopenharmony_ci:data:`FILTER_DIR`:
24217db96d56Sopenharmony_ci
24227db96d56Sopenharmony_ci.. doctest::
24237db96d56Sopenharmony_ci    :options: +ELLIPSIS,+NORMALIZE_WHITESPACE
24247db96d56Sopenharmony_ci
24257db96d56Sopenharmony_ci    >>> from unittest import mock
24267db96d56Sopenharmony_ci    >>> mock.FILTER_DIR = False
24277db96d56Sopenharmony_ci    >>> dir(mock.Mock())
24287db96d56Sopenharmony_ci    ['_NonCallableMock__get_return_value',
24297db96d56Sopenharmony_ci     '_NonCallableMock__get_side_effect',
24307db96d56Sopenharmony_ci     '_NonCallableMock__return_value_doc',
24317db96d56Sopenharmony_ci     '_NonCallableMock__set_return_value',
24327db96d56Sopenharmony_ci     '_NonCallableMock__set_side_effect',
24337db96d56Sopenharmony_ci     '__call__',
24347db96d56Sopenharmony_ci     '__class__',
24357db96d56Sopenharmony_ci     ...
24367db96d56Sopenharmony_ci
24377db96d56Sopenharmony_ciAlternatively you can just use ``vars(my_mock)`` (instance members) and
24387db96d56Sopenharmony_ci``dir(type(my_mock))`` (type members) to bypass the filtering irrespective of
24397db96d56Sopenharmony_ci:data:`mock.FILTER_DIR`.
24407db96d56Sopenharmony_ci
24417db96d56Sopenharmony_ci
24427db96d56Sopenharmony_cimock_open
24437db96d56Sopenharmony_ci~~~~~~~~~
24447db96d56Sopenharmony_ci
24457db96d56Sopenharmony_ci.. function:: mock_open(mock=None, read_data=None)
24467db96d56Sopenharmony_ci
24477db96d56Sopenharmony_ci   A helper function to create a mock to replace the use of :func:`open`. It works
24487db96d56Sopenharmony_ci   for :func:`open` called directly or used as a context manager.
24497db96d56Sopenharmony_ci
24507db96d56Sopenharmony_ci   The *mock* argument is the mock object to configure. If ``None`` (the
24517db96d56Sopenharmony_ci   default) then a :class:`MagicMock` will be created for you, with the API limited
24527db96d56Sopenharmony_ci   to methods or attributes available on standard file handles.
24537db96d56Sopenharmony_ci
24547db96d56Sopenharmony_ci   *read_data* is a string for the :meth:`~io.IOBase.read`,
24557db96d56Sopenharmony_ci   :meth:`~io.IOBase.readline`, and :meth:`~io.IOBase.readlines` methods
24567db96d56Sopenharmony_ci   of the file handle to return.  Calls to those methods will take data from
24577db96d56Sopenharmony_ci   *read_data* until it is depleted.  The mock of these methods is pretty
24587db96d56Sopenharmony_ci   simplistic: every time the *mock* is called, the *read_data* is rewound to
24597db96d56Sopenharmony_ci   the start.  If you need more control over the data that you are feeding to
24607db96d56Sopenharmony_ci   the tested code you will need to customize this mock for yourself.  When that
24617db96d56Sopenharmony_ci   is insufficient, one of the in-memory filesystem packages on `PyPI
24627db96d56Sopenharmony_ci   <https://pypi.org>`_ can offer a realistic filesystem for testing.
24637db96d56Sopenharmony_ci
24647db96d56Sopenharmony_ci   .. versionchanged:: 3.4
24657db96d56Sopenharmony_ci      Added :meth:`~io.IOBase.readline` and :meth:`~io.IOBase.readlines` support.
24667db96d56Sopenharmony_ci      The mock of :meth:`~io.IOBase.read` changed to consume *read_data* rather
24677db96d56Sopenharmony_ci      than returning it on each call.
24687db96d56Sopenharmony_ci
24697db96d56Sopenharmony_ci   .. versionchanged:: 3.5
24707db96d56Sopenharmony_ci      *read_data* is now reset on each call to the *mock*.
24717db96d56Sopenharmony_ci
24727db96d56Sopenharmony_ci   .. versionchanged:: 3.8
24737db96d56Sopenharmony_ci      Added :meth:`__iter__` to implementation so that iteration (such as in for
24747db96d56Sopenharmony_ci      loops) correctly consumes *read_data*.
24757db96d56Sopenharmony_ci
24767db96d56Sopenharmony_ciUsing :func:`open` as a context manager is a great way to ensure your file handles
24777db96d56Sopenharmony_ciare closed properly and is becoming common::
24787db96d56Sopenharmony_ci
24797db96d56Sopenharmony_ci    with open('/some/path', 'w') as f:
24807db96d56Sopenharmony_ci        f.write('something')
24817db96d56Sopenharmony_ci
24827db96d56Sopenharmony_ciThe issue is that even if you mock out the call to :func:`open` it is the
24837db96d56Sopenharmony_ci*returned object* that is used as a context manager (and has :meth:`__enter__` and
24847db96d56Sopenharmony_ci:meth:`__exit__` called).
24857db96d56Sopenharmony_ci
24867db96d56Sopenharmony_ciMocking context managers with a :class:`MagicMock` is common enough and fiddly
24877db96d56Sopenharmony_cienough that a helper function is useful. ::
24887db96d56Sopenharmony_ci
24897db96d56Sopenharmony_ci    >>> m = mock_open()
24907db96d56Sopenharmony_ci    >>> with patch('__main__.open', m):
24917db96d56Sopenharmony_ci    ...     with open('foo', 'w') as h:
24927db96d56Sopenharmony_ci    ...         h.write('some stuff')
24937db96d56Sopenharmony_ci    ...
24947db96d56Sopenharmony_ci    >>> m.mock_calls
24957db96d56Sopenharmony_ci    [call('foo', 'w'),
24967db96d56Sopenharmony_ci     call().__enter__(),
24977db96d56Sopenharmony_ci     call().write('some stuff'),
24987db96d56Sopenharmony_ci     call().__exit__(None, None, None)]
24997db96d56Sopenharmony_ci    >>> m.assert_called_once_with('foo', 'w')
25007db96d56Sopenharmony_ci    >>> handle = m()
25017db96d56Sopenharmony_ci    >>> handle.write.assert_called_once_with('some stuff')
25027db96d56Sopenharmony_ci
25037db96d56Sopenharmony_ciAnd for reading files::
25047db96d56Sopenharmony_ci
25057db96d56Sopenharmony_ci    >>> with patch('__main__.open', mock_open(read_data='bibble')) as m:
25067db96d56Sopenharmony_ci    ...     with open('foo') as h:
25077db96d56Sopenharmony_ci    ...         result = h.read()
25087db96d56Sopenharmony_ci    ...
25097db96d56Sopenharmony_ci    >>> m.assert_called_once_with('foo')
25107db96d56Sopenharmony_ci    >>> assert result == 'bibble'
25117db96d56Sopenharmony_ci
25127db96d56Sopenharmony_ci
25137db96d56Sopenharmony_ci.. _auto-speccing:
25147db96d56Sopenharmony_ci
25157db96d56Sopenharmony_ciAutospeccing
25167db96d56Sopenharmony_ci~~~~~~~~~~~~
25177db96d56Sopenharmony_ci
25187db96d56Sopenharmony_ciAutospeccing is based on the existing :attr:`spec` feature of mock. It limits the
25197db96d56Sopenharmony_ciapi of mocks to the api of an original object (the spec), but it is recursive
25207db96d56Sopenharmony_ci(implemented lazily) so that attributes of mocks only have the same api as
25217db96d56Sopenharmony_cithe attributes of the spec. In addition mocked functions / methods have the
25227db96d56Sopenharmony_cisame call signature as the original so they raise a :exc:`TypeError` if they are
25237db96d56Sopenharmony_cicalled incorrectly.
25247db96d56Sopenharmony_ci
25257db96d56Sopenharmony_ciBefore I explain how auto-speccing works, here's why it is needed.
25267db96d56Sopenharmony_ci
25277db96d56Sopenharmony_ci:class:`Mock` is a very powerful and flexible object, but it suffers from two flaws
25287db96d56Sopenharmony_ciwhen used to mock out objects from a system under test. One of these flaws is
25297db96d56Sopenharmony_cispecific to the :class:`Mock` api and the other is a more general problem with using
25307db96d56Sopenharmony_cimock objects.
25317db96d56Sopenharmony_ci
25327db96d56Sopenharmony_ciFirst the problem specific to :class:`Mock`. :class:`Mock` has two assert methods that are
25337db96d56Sopenharmony_ciextremely handy: :meth:`~Mock.assert_called_with` and
25347db96d56Sopenharmony_ci:meth:`~Mock.assert_called_once_with`.
25357db96d56Sopenharmony_ci
25367db96d56Sopenharmony_ci    >>> mock = Mock(name='Thing', return_value=None)
25377db96d56Sopenharmony_ci    >>> mock(1, 2, 3)
25387db96d56Sopenharmony_ci    >>> mock.assert_called_once_with(1, 2, 3)
25397db96d56Sopenharmony_ci    >>> mock(1, 2, 3)
25407db96d56Sopenharmony_ci    >>> mock.assert_called_once_with(1, 2, 3)
25417db96d56Sopenharmony_ci    Traceback (most recent call last):
25427db96d56Sopenharmony_ci     ...
25437db96d56Sopenharmony_ci    AssertionError: Expected 'mock' to be called once. Called 2 times.
25447db96d56Sopenharmony_ci
25457db96d56Sopenharmony_ciBecause mocks auto-create attributes on demand, and allow you to call them
25467db96d56Sopenharmony_ciwith arbitrary arguments, if you misspell one of these assert methods then
25477db96d56Sopenharmony_ciyour assertion is gone:
25487db96d56Sopenharmony_ci
25497db96d56Sopenharmony_ci.. code-block:: pycon
25507db96d56Sopenharmony_ci
25517db96d56Sopenharmony_ci    >>> mock = Mock(name='Thing', return_value=None)
25527db96d56Sopenharmony_ci    >>> mock(1, 2, 3)
25537db96d56Sopenharmony_ci    >>> mock.assret_called_once_with(4, 5, 6)  # Intentional typo!
25547db96d56Sopenharmony_ci
25557db96d56Sopenharmony_ciYour tests can pass silently and incorrectly because of the typo.
25567db96d56Sopenharmony_ci
25577db96d56Sopenharmony_ciThe second issue is more general to mocking. If you refactor some of your
25587db96d56Sopenharmony_cicode, rename members and so on, any tests for code that is still using the
25597db96d56Sopenharmony_ci*old api* but uses mocks instead of the real objects will still pass. This
25607db96d56Sopenharmony_cimeans your tests can all pass even though your code is broken.
25617db96d56Sopenharmony_ci
25627db96d56Sopenharmony_ciNote that this is another reason why you need integration tests as well as
25637db96d56Sopenharmony_ciunit tests. Testing everything in isolation is all fine and dandy, but if you
25647db96d56Sopenharmony_cidon't test how your units are "wired together" there is still lots of room
25657db96d56Sopenharmony_cifor bugs that tests might have caught.
25667db96d56Sopenharmony_ci
25677db96d56Sopenharmony_ci:mod:`mock` already provides a feature to help with this, called speccing. If you
25687db96d56Sopenharmony_ciuse a class or instance as the :attr:`spec` for a mock then you can only access
25697db96d56Sopenharmony_ciattributes on the mock that exist on the real class:
25707db96d56Sopenharmony_ci
25717db96d56Sopenharmony_ci    >>> from urllib import request
25727db96d56Sopenharmony_ci    >>> mock = Mock(spec=request.Request)
25737db96d56Sopenharmony_ci    >>> mock.assret_called_with  # Intentional typo!
25747db96d56Sopenharmony_ci    Traceback (most recent call last):
25757db96d56Sopenharmony_ci     ...
25767db96d56Sopenharmony_ci    AttributeError: Mock object has no attribute 'assret_called_with'
25777db96d56Sopenharmony_ci
25787db96d56Sopenharmony_ciThe spec only applies to the mock itself, so we still have the same issue
25797db96d56Sopenharmony_ciwith any methods on the mock:
25807db96d56Sopenharmony_ci
25817db96d56Sopenharmony_ci.. code-block:: pycon
25827db96d56Sopenharmony_ci
25837db96d56Sopenharmony_ci    >>> mock.has_data()
25847db96d56Sopenharmony_ci    <mock.Mock object at 0x...>
25857db96d56Sopenharmony_ci    >>> mock.has_data.assret_called_with()  # Intentional typo!
25867db96d56Sopenharmony_ci
25877db96d56Sopenharmony_ciAuto-speccing solves this problem. You can either pass ``autospec=True`` to
25887db96d56Sopenharmony_ci:func:`patch` / :func:`patch.object` or use the :func:`create_autospec` function to create a
25897db96d56Sopenharmony_cimock with a spec. If you use the ``autospec=True`` argument to :func:`patch` then the
25907db96d56Sopenharmony_ciobject that is being replaced will be used as the spec object. Because the
25917db96d56Sopenharmony_cispeccing is done "lazily" (the spec is created as attributes on the mock are
25927db96d56Sopenharmony_ciaccessed) you can use it with very complex or deeply nested objects (like
25937db96d56Sopenharmony_cimodules that import modules that import modules) without a big performance
25947db96d56Sopenharmony_cihit.
25957db96d56Sopenharmony_ci
25967db96d56Sopenharmony_ciHere's an example of it in use::
25977db96d56Sopenharmony_ci
25987db96d56Sopenharmony_ci    >>> from urllib import request
25997db96d56Sopenharmony_ci    >>> patcher = patch('__main__.request', autospec=True)
26007db96d56Sopenharmony_ci    >>> mock_request = patcher.start()
26017db96d56Sopenharmony_ci    >>> request is mock_request
26027db96d56Sopenharmony_ci    True
26037db96d56Sopenharmony_ci    >>> mock_request.Request
26047db96d56Sopenharmony_ci    <MagicMock name='request.Request' spec='Request' id='...'>
26057db96d56Sopenharmony_ci
26067db96d56Sopenharmony_ciYou can see that :class:`request.Request` has a spec. :class:`request.Request` takes two
26077db96d56Sopenharmony_ciarguments in the constructor (one of which is *self*). Here's what happens if
26087db96d56Sopenharmony_ciwe try to call it incorrectly::
26097db96d56Sopenharmony_ci
26107db96d56Sopenharmony_ci    >>> req = request.Request()
26117db96d56Sopenharmony_ci    Traceback (most recent call last):
26127db96d56Sopenharmony_ci     ...
26137db96d56Sopenharmony_ci    TypeError: <lambda>() takes at least 2 arguments (1 given)
26147db96d56Sopenharmony_ci
26157db96d56Sopenharmony_ciThe spec also applies to instantiated classes (i.e. the return value of
26167db96d56Sopenharmony_cispecced mocks)::
26177db96d56Sopenharmony_ci
26187db96d56Sopenharmony_ci    >>> req = request.Request('foo')
26197db96d56Sopenharmony_ci    >>> req
26207db96d56Sopenharmony_ci    <NonCallableMagicMock name='request.Request()' spec='Request' id='...'>
26217db96d56Sopenharmony_ci
26227db96d56Sopenharmony_ci:class:`Request` objects are not callable, so the return value of instantiating our
26237db96d56Sopenharmony_cimocked out :class:`request.Request` is a non-callable mock. With the spec in place
26247db96d56Sopenharmony_ciany typos in our asserts will raise the correct error::
26257db96d56Sopenharmony_ci
26267db96d56Sopenharmony_ci    >>> req.add_header('spam', 'eggs')
26277db96d56Sopenharmony_ci    <MagicMock name='request.Request().add_header()' id='...'>
26287db96d56Sopenharmony_ci    >>> req.add_header.assret_called_with  # Intentional typo!
26297db96d56Sopenharmony_ci    Traceback (most recent call last):
26307db96d56Sopenharmony_ci     ...
26317db96d56Sopenharmony_ci    AttributeError: Mock object has no attribute 'assret_called_with'
26327db96d56Sopenharmony_ci    >>> req.add_header.assert_called_with('spam', 'eggs')
26337db96d56Sopenharmony_ci
26347db96d56Sopenharmony_ciIn many cases you will just be able to add ``autospec=True`` to your existing
26357db96d56Sopenharmony_ci:func:`patch` calls and then be protected against bugs due to typos and api
26367db96d56Sopenharmony_cichanges.
26377db96d56Sopenharmony_ci
26387db96d56Sopenharmony_ciAs well as using *autospec* through :func:`patch` there is a
26397db96d56Sopenharmony_ci:func:`create_autospec` for creating autospecced mocks directly:
26407db96d56Sopenharmony_ci
26417db96d56Sopenharmony_ci    >>> from urllib import request
26427db96d56Sopenharmony_ci    >>> mock_request = create_autospec(request)
26437db96d56Sopenharmony_ci    >>> mock_request.Request('foo', 'bar')
26447db96d56Sopenharmony_ci    <NonCallableMagicMock name='mock.Request()' spec='Request' id='...'>
26457db96d56Sopenharmony_ci
26467db96d56Sopenharmony_ciThis isn't without caveats and limitations however, which is why it is not
26477db96d56Sopenharmony_cithe default behaviour. In order to know what attributes are available on the
26487db96d56Sopenharmony_cispec object, autospec has to introspect (access attributes) the spec. As you
26497db96d56Sopenharmony_citraverse attributes on the mock a corresponding traversal of the original
26507db96d56Sopenharmony_ciobject is happening under the hood. If any of your specced objects have
26517db96d56Sopenharmony_ciproperties or descriptors that can trigger code execution then you may not be
26527db96d56Sopenharmony_ciable to use autospec. On the other hand it is much better to design your
26537db96d56Sopenharmony_ciobjects so that introspection is safe [#]_.
26547db96d56Sopenharmony_ci
26557db96d56Sopenharmony_ciA more serious problem is that it is common for instance attributes to be
26567db96d56Sopenharmony_cicreated in the :meth:`__init__` method and not to exist on the class at all.
26577db96d56Sopenharmony_ci*autospec* can't know about any dynamically created attributes and restricts
26587db96d56Sopenharmony_cithe api to visible attributes. ::
26597db96d56Sopenharmony_ci
26607db96d56Sopenharmony_ci    >>> class Something:
26617db96d56Sopenharmony_ci    ...   def __init__(self):
26627db96d56Sopenharmony_ci    ...     self.a = 33
26637db96d56Sopenharmony_ci    ...
26647db96d56Sopenharmony_ci    >>> with patch('__main__.Something', autospec=True):
26657db96d56Sopenharmony_ci    ...   thing = Something()
26667db96d56Sopenharmony_ci    ...   thing.a
26677db96d56Sopenharmony_ci    ...
26687db96d56Sopenharmony_ci    Traceback (most recent call last):
26697db96d56Sopenharmony_ci      ...
26707db96d56Sopenharmony_ci    AttributeError: Mock object has no attribute 'a'
26717db96d56Sopenharmony_ci
26727db96d56Sopenharmony_ciThere are a few different ways of resolving this problem. The easiest, but
26737db96d56Sopenharmony_cinot necessarily the least annoying, way is to simply set the required
26747db96d56Sopenharmony_ciattributes on the mock after creation. Just because *autospec* doesn't allow
26757db96d56Sopenharmony_ciyou to fetch attributes that don't exist on the spec it doesn't prevent you
26767db96d56Sopenharmony_cisetting them::
26777db96d56Sopenharmony_ci
26787db96d56Sopenharmony_ci    >>> with patch('__main__.Something', autospec=True):
26797db96d56Sopenharmony_ci    ...   thing = Something()
26807db96d56Sopenharmony_ci    ...   thing.a = 33
26817db96d56Sopenharmony_ci    ...
26827db96d56Sopenharmony_ci
26837db96d56Sopenharmony_ciThere is a more aggressive version of both *spec* and *autospec* that *does*
26847db96d56Sopenharmony_ciprevent you setting non-existent attributes. This is useful if you want to
26857db96d56Sopenharmony_ciensure your code only *sets* valid attributes too, but obviously it prevents
26867db96d56Sopenharmony_cithis particular scenario:
26877db96d56Sopenharmony_ci
26887db96d56Sopenharmony_ci    >>> with patch('__main__.Something', autospec=True, spec_set=True):
26897db96d56Sopenharmony_ci    ...   thing = Something()
26907db96d56Sopenharmony_ci    ...   thing.a = 33
26917db96d56Sopenharmony_ci    ...
26927db96d56Sopenharmony_ci    Traceback (most recent call last):
26937db96d56Sopenharmony_ci     ...
26947db96d56Sopenharmony_ci    AttributeError: Mock object has no attribute 'a'
26957db96d56Sopenharmony_ci
26967db96d56Sopenharmony_ciProbably the best way of solving the problem is to add class attributes as
26977db96d56Sopenharmony_cidefault values for instance members initialised in :meth:`__init__`. Note that if
26987db96d56Sopenharmony_ciyou are only setting default attributes in :meth:`__init__` then providing them via
26997db96d56Sopenharmony_ciclass attributes (shared between instances of course) is faster too. e.g.
27007db96d56Sopenharmony_ci
27017db96d56Sopenharmony_ci.. code-block:: python
27027db96d56Sopenharmony_ci
27037db96d56Sopenharmony_ci    class Something:
27047db96d56Sopenharmony_ci        a = 33
27057db96d56Sopenharmony_ci
27067db96d56Sopenharmony_ciThis brings up another issue. It is relatively common to provide a default
27077db96d56Sopenharmony_civalue of ``None`` for members that will later be an object of a different type.
27087db96d56Sopenharmony_ci``None`` would be useless as a spec because it wouldn't let you access *any*
27097db96d56Sopenharmony_ciattributes or methods on it. As ``None`` is *never* going to be useful as a
27107db96d56Sopenharmony_cispec, and probably indicates a member that will normally of some other type,
27117db96d56Sopenharmony_ciautospec doesn't use a spec for members that are set to ``None``. These will
27127db96d56Sopenharmony_cijust be ordinary mocks (well - MagicMocks):
27137db96d56Sopenharmony_ci
27147db96d56Sopenharmony_ci    >>> class Something:
27157db96d56Sopenharmony_ci    ...     member = None
27167db96d56Sopenharmony_ci    ...
27177db96d56Sopenharmony_ci    >>> mock = create_autospec(Something)
27187db96d56Sopenharmony_ci    >>> mock.member.foo.bar.baz()
27197db96d56Sopenharmony_ci    <MagicMock name='mock.member.foo.bar.baz()' id='...'>
27207db96d56Sopenharmony_ci
27217db96d56Sopenharmony_ciIf modifying your production classes to add defaults isn't to your liking
27227db96d56Sopenharmony_cithen there are more options. One of these is simply to use an instance as the
27237db96d56Sopenharmony_cispec rather than the class. The other is to create a subclass of the
27247db96d56Sopenharmony_ciproduction class and add the defaults to the subclass without affecting the
27257db96d56Sopenharmony_ciproduction class. Both of these require you to use an alternative object as
27267db96d56Sopenharmony_cithe spec. Thankfully :func:`patch` supports this - you can simply pass the
27277db96d56Sopenharmony_cialternative object as the *autospec* argument::
27287db96d56Sopenharmony_ci
27297db96d56Sopenharmony_ci    >>> class Something:
27307db96d56Sopenharmony_ci    ...   def __init__(self):
27317db96d56Sopenharmony_ci    ...     self.a = 33
27327db96d56Sopenharmony_ci    ...
27337db96d56Sopenharmony_ci    >>> class SomethingForTest(Something):
27347db96d56Sopenharmony_ci    ...   a = 33
27357db96d56Sopenharmony_ci    ...
27367db96d56Sopenharmony_ci    >>> p = patch('__main__.Something', autospec=SomethingForTest)
27377db96d56Sopenharmony_ci    >>> mock = p.start()
27387db96d56Sopenharmony_ci    >>> mock.a
27397db96d56Sopenharmony_ci    <NonCallableMagicMock name='Something.a' spec='int' id='...'>
27407db96d56Sopenharmony_ci
27417db96d56Sopenharmony_ci
27427db96d56Sopenharmony_ci.. [#] This only applies to classes or already instantiated objects. Calling
27437db96d56Sopenharmony_ci   a mocked class to create a mock instance *does not* create a real instance.
27447db96d56Sopenharmony_ci   It is only attribute lookups - along with calls to :func:`dir` - that are done.
27457db96d56Sopenharmony_ci
27467db96d56Sopenharmony_ciSealing mocks
27477db96d56Sopenharmony_ci~~~~~~~~~~~~~
27487db96d56Sopenharmony_ci
27497db96d56Sopenharmony_ci
27507db96d56Sopenharmony_ci.. testsetup::
27517db96d56Sopenharmony_ci
27527db96d56Sopenharmony_ci    from unittest.mock import seal
27537db96d56Sopenharmony_ci
27547db96d56Sopenharmony_ci.. function:: seal(mock)
27557db96d56Sopenharmony_ci
27567db96d56Sopenharmony_ci    Seal will disable the automatic creation of mocks when accessing an attribute of
27577db96d56Sopenharmony_ci    the mock being sealed or any of its attributes that are already mocks recursively.
27587db96d56Sopenharmony_ci
27597db96d56Sopenharmony_ci    If a mock instance with a name or a spec is assigned to an attribute
27607db96d56Sopenharmony_ci    it won't be considered in the sealing chain. This allows one to prevent seal from
27617db96d56Sopenharmony_ci    fixing part of the mock object. ::
27627db96d56Sopenharmony_ci
27637db96d56Sopenharmony_ci        >>> mock = Mock()
27647db96d56Sopenharmony_ci        >>> mock.submock.attribute1 = 2
27657db96d56Sopenharmony_ci        >>> mock.not_submock = mock.Mock(name="sample_name")
27667db96d56Sopenharmony_ci        >>> seal(mock)
27677db96d56Sopenharmony_ci        >>> mock.new_attribute  # This will raise AttributeError.
27687db96d56Sopenharmony_ci        >>> mock.submock.attribute2  # This will raise AttributeError.
27697db96d56Sopenharmony_ci        >>> mock.not_submock.attribute2  # This won't raise.
27707db96d56Sopenharmony_ci
27717db96d56Sopenharmony_ci    .. versionadded:: 3.7
2772