Pytest:runtimeerror线程“mainthread”中没有当前事件循环

2024-06-02 08:42:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我是使用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线程“mainthread”中没有当前事件循环

我觉得我需要用一种不同的方式来处理线程,如何修复它呢

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


Tags: loopasynciojsonurlpytestresponsesessiondef
1条回答
网友
1楼 · 发布于 2024-06-02 08:42:41

这应该起作用:

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(),因此它返回一个无法使用loop.call_later()的循环,而aiohttp.ClientSession()在内部使用该循环,这就是您需要使用 loop=asyncio.new\u event\u loop() asyncio.set\u event\u循环(循环) 请参阅此处的更多信息: https://github.com/python/cpython/blob/6fcb6cfb139ade1aac6dbee0b18ca72b18cbe0d2/Lib/asyncio/events.py#L735

相关问题 更多 >