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