@@ -201,9 +201,11 @@ The Mock Class
201201
202202.. testsetup ::
203203
204+ import asyncio
205+ import inspect
204206 import unittest
205207 from unittest.mock import sentinel, DEFAULT, ANY
206- from unittest.mock import patch, call, Mock, MagicMock, PropertyMock
208+ from unittest.mock import patch, call, Mock, MagicMock, PropertyMock, AsyncMock
207209 from unittest.mock import mock_open
208210
209211:class: `Mock ` is a flexible mock object intended to replace the use of stubs and
@@ -851,6 +853,217 @@ object::
851853 >>> p.assert_called_once_with()
852854
853855
856+ .. class :: AsyncMock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs)
857+
858+ An asynchronous version of :class: `Mock `. The :class: `AsyncMock ` object will
859+ behave so the object is recognized as an async function, and the result of a
860+ call is an awaitable.
861+
862+ >>> mock = AsyncMock()
863+ >>> asyncio.iscoroutinefunction(mock)
864+ True
865+ >>> inspect.isawaitable(mock())
866+ True
867+
868+ The result of ``mock() `` is an async function which will have the outcome
869+ of ``side_effect `` or ``return_value ``:
870+
871+ - if ``side_effect `` is a function, the async function will return the
872+ result of that function,
873+ - if ``side_effect `` is an exception, the async function will raise the
874+ exception,
875+ - if ``side_effect `` is an iterable, the async function will return the
876+ next value of the iterable, however, if the sequence of result is
877+ exhausted, ``StopIteration `` is raised immediately,
878+ - if ``side_effect `` is not defined, the async function will return the
879+ value defined by ``return_value ``, hence, by default, the async function
880+ returns a new :class: `AsyncMock ` object.
881+
882+
883+ Setting the *spec * of a :class: `Mock ` or :class: `MagicMock ` to an async function
884+ will result in a coroutine object being returned after calling.
885+
886+ >>> async def async_func (): pass
887+ ...
888+ >>> mock = MagicMock(async_func)
889+ >>> mock
890+ <MagicMock spec='function' id='...'>
891+ >>> mock()
892+ <coroutine object AsyncMockMixin._mock_call at ...>
893+
894+ .. method :: assert_awaited()
895+
896+ Assert that the mock was awaited at least once.
897+
898+ >>> mock = AsyncMock()
899+ >>> async def main ():
900+ ... await mock()
901+ ...
902+ >>> asyncio.run(main())
903+ >>> mock.assert_awaited()
904+ >>> mock_2 = AsyncMock()
905+ >>> mock_2.assert_awaited()
906+ Traceback (most recent call last):
907+ ...
908+ AssertionError: Expected mock to have been awaited.
909+
910+ .. method :: assert_awaited_once()
911+
912+ Assert that the mock was awaited exactly once.
913+
914+ >>> mock = AsyncMock()
915+ >>> async def main ():
916+ ... await mock()
917+ ...
918+ >>> asyncio.run(main())
919+ >>> mock.assert_awaited_once()
920+ >>> asyncio.run(main())
921+ >>> mock.method.assert_awaited_once()
922+ Traceback (most recent call last):
923+ ...
924+ AssertionError: Expected mock to have been awaited once. Awaited 2 times.
925+
926+ .. method :: assert_awaited_with(*args, **kwargs)
927+
928+ Assert that the last await was with the specified arguments.
929+
930+ >>> mock = AsyncMock()
931+ >>> async def main (* args , ** kwargs ):
932+ ... await mock(* args, ** kwargs)
933+ ...
934+ >>> asyncio.run(main(' foo' , bar = ' bar' ))
935+ >>> mock.assert_awaited_with(' foo' , bar = ' bar' )
936+ >>> mock.assert_awaited_with(' other' )
937+ Traceback (most recent call last):
938+ ...
939+ AssertionError: expected call not found.
940+ Expected: mock('other')
941+ Actual: mock('foo', bar='bar')
942+
943+ .. method :: assert_awaited_once_with(*args, **kwargs)
944+
945+ Assert that the mock was awaited exactly once and with the specified
946+ arguments.
947+
948+ >>> mock = AsyncMock()
949+ >>> async def main (* args , ** kwargs ):
950+ ... await mock(* args, ** kwargs)
951+ ...
952+ >>> asyncio.run(main(' foo' , bar = ' bar' ))
953+ >>> mock.assert_awaited_once_with(' foo' , bar = ' bar' )
954+ >>> asyncio.run(main(' foo' , bar = ' bar' ))
955+ >>> mock.assert_awaited_once_with(' foo' , bar = ' bar' )
956+ Traceback (most recent call last):
957+ ...
958+ AssertionError: Expected mock to have been awaited once. Awaited 2 times.
959+
960+ .. method :: assert_any_await(*args, **kwargs)
961+
962+ Assert the mock has ever been awaited with the specified arguments.
963+
964+ >>> mock = AsyncMock()
965+ >>> async def main (* args , ** kwargs ):
966+ ... await mock(* args, ** kwargs)
967+ ...
968+ >>> asyncio.run(main(' foo' , bar = ' bar' ))
969+ >>> asyncio.run(main(' hello' ))
970+ >>> mock.assert_any_await(' foo' , bar = ' bar' )
971+ >>> mock.assert_any_await(' other' )
972+ Traceback (most recent call last):
973+ ...
974+ AssertionError: mock('other') await not found
975+
976+ .. method :: assert_has_awaits(calls, any_order=False)
977+
978+ Assert the mock has been awaited with the specified calls.
979+ The :attr: `await_args_list ` list is checked for the awaits.
980+
981+ If *any_order * is False (the default) then the awaits must be
982+ sequential. There can be extra calls before or after the
983+ specified awaits.
984+
985+ If *any_order * is True then the awaits can be in any order, but
986+ they must all appear in :attr: `await_args_list `.
987+
988+ >>> mock = AsyncMock()
989+ >>> async def main (* args , ** kwargs ):
990+ ... await mock(* args, ** kwargs)
991+ ...
992+ >>> calls = [call(" foo" ), call(" bar" )]
993+ >>> mock.assert_has_calls(calls)
994+ Traceback (most recent call last):
995+ ...
996+ AssertionError: Calls not found.
997+ Expected: [call('foo'), call('bar')]
998+ >>> asyncio.run(main(' foo' ))
999+ >>> asyncio.run(main(' bar' ))
1000+ >>> mock.assert_has_calls(calls)
1001+
1002+ .. method :: assert_not_awaited()
1003+
1004+ Assert that the mock was never awaited.
1005+
1006+ >>> mock = AsyncMock()
1007+ >>> mock.assert_not_awaited()
1008+
1009+ .. method :: reset_mock(*args, **kwargs)
1010+
1011+ See :func: `Mock.reset_mock `. Also sets :attr: `await_count ` to 0,
1012+ :attr: `await_args ` to None, and clears the :attr: `await_args_list `.
1013+
1014+ .. attribute :: await_count
1015+
1016+ An integer keeping track of how many times the mock object has been awaited.
1017+
1018+ >>> mock = AsyncMock()
1019+ >>> async def main ():
1020+ ... await mock()
1021+ ...
1022+ >>> asyncio.run(main())
1023+ >>> mock.await_count
1024+ 1
1025+ >>> asyncio.run(main())
1026+ >>> mock.await_count
1027+ 2
1028+
1029+ .. attribute :: await_args
1030+
1031+ This is either ``None `` (if the mock hasn’t been awaited), or the arguments that
1032+ the mock was last awaited with. Functions the same as :attr: `Mock.call_args `.
1033+
1034+ >>> mock = AsyncMock()
1035+ >>> async def main (* args ):
1036+ ... await mock(* args)
1037+ ...
1038+ >>> mock.await_args
1039+ >>> asyncio.run(main(' foo' ))
1040+ >>> mock.await_args
1041+ call('foo')
1042+ >>> asyncio.run(main(' bar' ))
1043+ >>> mock.await_args
1044+ call('bar')
1045+
1046+
1047+ .. attribute :: await_args_list
1048+
1049+ This is a list of all the awaits made to the mock object in sequence (so the
1050+ length of the list is the number of times it has been awaited). Before any
1051+ awaits have been made it is an empty list.
1052+
1053+ >>> mock = AsyncMock()
1054+ >>> async def main (* args ):
1055+ ... await mock(* args)
1056+ ...
1057+ >>> mock.await_args_list
1058+ []
1059+ >>> asyncio.run(main(' foo' ))
1060+ >>> mock.await_args_list
1061+ [call('foo')]
1062+ >>> asyncio.run(main(' bar' ))
1063+ >>> mock.await_args_list
1064+ [call('foo'), call('bar')]
1065+
1066+
8541067Calling
8551068~~~~~~~
8561069
0 commit comments