测试从常规函数调用 python 协程(async def)
Test calling a python coroutine (async def) from a regular function
假设我有一些 asyncio 协程,它获取一些数据并 returns 它。像这样:
async def fetch_data(*args):
result = await some_io()
return result
基本上这个协程是从协程链中调用的,初始协程是运行通过创建任务来实现的。
但是,如果出于测试目的我想 运行 只有一个协程,就在 运行 一些文件时这样:
if __name__ == '__main__':
result = await fetch_data(*args)
print(result)
显然我不能这样做,因为我正在尝试 运行 并等待来自非协程函数的协程。
所以问题是:是否有一些正确的方法可以在不调用协程的情况下从协程获取数据?
我可以为 result
创建一些 Future
对象并等待它,但也许还有其他一些更简单更清晰的方法?
您需要为 运行 您的协程创建一个事件循环:
import asyncio
async def async_func():
return "hello"
loop = asyncio.get_event_loop()
result = loop.run_until_complete(async_func())
loop.close()
print(result)
或作为函数:
def run_coroutine(f, *args, **kwargs):
loop = asyncio.get_event_loop()
result = loop.run_until_complete(f(*args, **kwargs))
loop.close()
return result
这样使用:
print(run_coroutine(async_func))
或者:
assert "expected" == run_coroutine(fetch_data, "param1", param2="foo")
假设我有一些 asyncio 协程,它获取一些数据并 returns 它。像这样:
async def fetch_data(*args):
result = await some_io()
return result
基本上这个协程是从协程链中调用的,初始协程是运行通过创建任务来实现的。 但是,如果出于测试目的我想 运行 只有一个协程,就在 运行 一些文件时这样:
if __name__ == '__main__':
result = await fetch_data(*args)
print(result)
显然我不能这样做,因为我正在尝试 运行 并等待来自非协程函数的协程。
所以问题是:是否有一些正确的方法可以在不调用协程的情况下从协程获取数据?
我可以为 result
创建一些 Future
对象并等待它,但也许还有其他一些更简单更清晰的方法?
您需要为 运行 您的协程创建一个事件循环:
import asyncio
async def async_func():
return "hello"
loop = asyncio.get_event_loop()
result = loop.run_until_complete(async_func())
loop.close()
print(result)
或作为函数:
def run_coroutine(f, *args, **kwargs):
loop = asyncio.get_event_loop()
result = loop.run_until_complete(f(*args, **kwargs))
loop.close()
return result
这样使用:
print(run_coroutine(async_func))
或者:
assert "expected" == run_coroutine(fetch_data, "param1", param2="foo")