async def too_many_sleep(delay):
await asyncio.sleep(delay)
do_something()
def test_code():
task = event_loop.create_task(too_many_sleep(10000))
# I want test like `assert_called(do_something)` without realtime delays
我想要什么:
def test_code():
task = event_loop.create_task(too_many_sleep(10000))
...
# trick the time
with time_shift(sec=10000):
assert task.done()
我在做什么:def test_code():
task = event_loop.create_task(too_many_sleep(10000))
# run tests and I will see a sunrise
no,
freezegun
asyncio.sleep()
,因为ASYNCIO
loop.time()
方法.。
在
freezegun
项目存储库中有一个问题,它询问如何处理asyncio.sleep()
,但仍没有提出的解决方案开放。
你可以嘲笑自己:
上面的测试期间,上面用
from unittest import mock
class AsyncMock(mock.MagicMock):
async def __call__(self, *args, **kwargs):
return super(AsyncMock, self).__call__(*args, **kwargs)
with mock.patch('asyncio.sleep', new_callable=AsyncMock):
task = event_loop.create_task(too_many_sleep(10000))
实例替换了,asyncio.sleep
当调用时,什么都不做。
Martijn Pieters的解决方案效果很好。但是,自3.8以来,python的UnitTest库中已经有一个。您可以使用那个:
AsyncMock()