summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXtreak <tir.karthi@gmail.com>2019-09-10 10:37:17 (GMT)
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-09-10 10:37:17 (GMT)
commitc8dfa7333d6317d7cd8c5c7366023f5a668e3f91 (patch)
tree94c61ee92b8f6ae47722db90893a1acad44f54a4
parentbd0c7a12d9e28ce74bfc16244d7694aca906838c (diff)
downloadcpython-c8dfa7333d6317d7cd8c5c7366023f5a668e3f91.zip
cpython-c8dfa7333d6317d7cd8c5c7366023f5a668e3f91.tar.gz
cpython-c8dfa7333d6317d7cd8c5c7366023f5a668e3f91.tar.bz2
bpo-37052: Add examples for mocking async iterators and context managers (GH-14660)
Add examples for mocking asynchronous iterators and asynchronous context managers. https://bugs.python.org/issue37052
-rw-r--r--Doc/library/unittest.mock-examples.rst39
1 files changed, 39 insertions, 0 deletions
diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst
index 811f0fb..cf6b671 100644
--- a/Doc/library/unittest.mock-examples.rst
+++ b/Doc/library/unittest.mock-examples.rst
@@ -12,6 +12,7 @@
.. testsetup::
+ import asyncio
import unittest
from unittest.mock import Mock, MagicMock, patch, call, sentinel
@@ -276,6 +277,44 @@ function returns is what the call returns:
2
+Mocking asynchronous iterators
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Since Python 3.8, ``MagicMock`` has support to mock :ref:`async-iterators`
+through ``__aiter__``. The :attr:`~Mock.return_value` attribute of ``__aiter__``
+can be used to set the return values to be used for iteration.
+
+ >>> mock = MagicMock()
+ >>> mock.__aiter__.return_value = [1, 2, 3]
+ >>> async def main():
+ ... return [i async for i in mock]
+ >>> asyncio.run(main())
+ [1, 2, 3]
+
+
+Mocking asynchronous context manager
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Since Python 3.8, ``MagicMock`` has support to mock
+:ref:`async-context-managers` through ``__aenter__`` and ``__aexit__``. The
+return value of ``__aenter__`` is an :class:`AsyncMock`.
+
+ >>> class AsyncContextManager:
+ ...
+ ... async def __aenter__(self):
+ ... return self
+ ...
+ ... async def __aexit__(self):
+ ... pass
+ >>> mock_instance = MagicMock(AsyncContextManager())
+ >>> async def main():
+ ... async with mock_instance as result:
+ ... pass
+ >>> asyncio.run(main())
+ >>> mock_instance.__aenter__.assert_called_once()
+ >>> mock_instance.__aexit__.assert_called_once()
+
+
Creating a Mock from an Existing Object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~