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
This commit is contained in:
parent
bd0c7a12d9
commit
c8dfa7333d
|
@ -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
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
|
Loading…
Reference in New Issue