我正在编写一些基于异步的代码,并且正在尝试完成预定的操作。我想为我的代码编写一些单元测试。对涉及call_later()
动作的代码进行单元测试的“好”方法是什么?我想避免实际等待几秒钟,所以我需要以某种方式模拟时间。
最小的例子:
import asyncio
def do_more_stuff():
print("doing more stuff")
async def do_stuff():
print("doing stuff")
await asyncio.sleep(0.1)
print("scheduling more stuff")
asyncio.get_event_loop().call_later(2, do_more_stuff)
def test_delayed_action(event_loop: asyncio.AbstractEventLoop):
asyncio.set_event_loop(event_loop)
asyncio.get_event_loop().create_task(do_stuff())
event_loop.run_forever()
这个例子有多个问题:
由于
run_forever()
,它不会在do_more_stuff()
被调用后终止。我想一直event_loop
运行,直到没有更多的回调计划。这可能吗?即使我将来破解并使用
event_loop.run_until_complete(fut)
,这个测试仍然需要 2 秒才能完成。我只想运行do_stuff()
和检查预定的回调;或提前时间来加快回调的触发。这些都可能吗?