.. versionadded:: 3.8
+ .. attribute:: loop_factory
+
+ The *loop_factory* passed to :class:`asyncio.Runner`. Override
+ in subclasses with :class:`asyncio.EventLoop` to avoid using the
+ asyncio policy system.
+
+ .. versionadded:: 3.13
+
.. coroutinemethod:: asyncSetUp()
Method called to prepare the test fixture. This is called after :meth:`setUp`.
result = test.run()
self.assertTrue(result.wasSuccessful())
+ def test_loop_factory(self):
+ asyncio.set_event_loop_policy(None)
+
+ class TestCase1(unittest.IsolatedAsyncioTestCase):
+ loop_factory = asyncio.EventLoop
+
+ async def test_demo1(self):
+ pass
+
+ test = TestCase1('test_demo1')
+ result = test.run()
+ self.assertTrue(result.wasSuccessful())
+ self.assertIsNone(support.maybe_get_event_loop_policy())
+
if __name__ == "__main__":
unittest.main()
# them inside the same task.
# Note: the test case modifies event loop policy if the policy was not instantiated
- # yet.
+ # yet, unless loop_factory=asyncio.EventLoop is set.
# asyncio.get_event_loop_policy() creates a default policy on demand but never
# returns None
# I believe this is not an issue in user level tests but python itself for testing
# should reset a policy in every test module
# by calling asyncio.set_event_loop_policy(None) in tearDownModule()
+ # or set loop_factory=asyncio.EventLoop
+
+ loop_factory = None
def __init__(self, methodName='runTest'):
super().__init__(methodName)
def _setupAsyncioRunner(self):
assert self._asyncioRunner is None, 'asyncio runner is already initialized'
- runner = asyncio.Runner(debug=True)
+ runner = asyncio.Runner(debug=True, loop_factory=self.loop_factory)
self._asyncioRunner = runner
def _tearDownAsyncioRunner(self):