python - Pytest:runtimeerror线程 'mainthread'中没有当前事件循环

标签 python pytest python-asyncio

我是使用 asyncio 的新手,我有一个正在尝试使用 pytest 测试的测试函数:这是我的测试结构:

MyClass()
    
    async def myFunction(payload, headers):
        session = aiohttp.ClientSession()
        with session.post(url, json=payload, headers=headers) as resp:
        
            response = await resp.json()
    
        return response

然后我的测试如下:

def my_test():
    loop = asyncio.get_event_loop()
    reponse = loop.run_until_complete(MyClass().myFunction(url, headers))
    loop.close()

当我运行测试时,我得到了:

pytest runtimeerror 线程“主线程”中没有当前事件循环

我该如何解决它,我觉得我需要以不同的方式处理线程。

我看过一些相关的问题,但没有人使用 pytests 最后我使用的是 Python 3.8.6。

最佳答案

这应该可行:

def my_test():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    response = loop.run_until_complete(MyClass().my_function())
    loop.close()
    # assert your response

说明:

由于您从测试上下文调用 asyncio.get_event_loop(),它返回一个循环,该循环无法使用 aiohttp.ClientSession() 内部使用的 loop.call_later(),这就是您需要的原因使用 循环 = asyncio.new_event_loop() asyncio.set_event_loop(循环) 在这里查看更多: https://github.com/python/cpython/blob/6fcb6cfb139ade1aac6dbee0b18ca72b18cbe0d2/Lib/asyncio/events.py#L735

关于python - Pytest:runtimeerror线程 'mainthread'中没有当前事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66583461/

相关文章:

python - 使用带修饰协程的单个事件循环返回 future 结果

python - 为什么 asyncio.queue 会失败?

python - Windows 中的 Jenkins 在激活 Python VENV 后停止

python - 用于测试的模拟密码哈希

python - 在pytest中人为地提前时间

python-3.x - asyncio - 如何在不停止事件循环的情况下停止(并重新启动)服务器?

python - 使用 RegEx 或 "import time"捕获日期

python - 'if not'

python - XGBoost 回归器中的 "reg_alpha"参数。使用高值是不是不好?

Python提取多级嵌套列表