python - 如何使用 `asyncio.sleep()` 包含的代码进行单元测试?
问题描述
我在编写包含 asyncio.sleep 的单元测试时遇到问题。我要等待实际的睡眠时间吗...?
我曾经freezegun
嘲笑过时间。当我尝试使用普通的可调用对象运行测试时,这个库真的很有帮助。但我找不到运行包含 asyncio.sleep 的测试的答案!
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
解决方案
不,freezegun
不修补影响asyncio.sleep()
,因为freezegun
不修补asyncioloop.time()
方法。
项目存储库中存在一个询问如何处理的问题,freezegun
asyncio.sleep()
但它仍然是开放的,没有建议的解决方案。
你可以嘲笑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
为一个AsyncMock()
实例,并且AsyncMock()
在调用时,什么也不做。
推荐阅读
- reactjs - 无效的挂钩调用。钩子只能在函数组件的主体内部调用。在裁剪图像并使用 React js 预览该图像时
- uiviewcontroller - SwiftUI:当我从视图层次结构中删除受控视图时,是否需要从控制器链中删除 UIHostingController?
- r - 闪亮仪表板框中的中心标题
- c - 如何解决我的分段错误核心转储错误?
- ios - 收到错误“找不到命令:fastlane”
- python - Quicker way to join multiple lists passed as args to a Python function?
- c++ - 输入为空的函数
- angular - 为延迟加载的模块编写单元测试用例
- c# - 无法跟踪 ** 类型的实例,因为它没有主键。只能跟踪具有主键的实体类型
- activerecord - ActiveRecord 查询其中 id 丢弃破折号后的内容