【发布时间】:2021-09-28 07:09:57
【问题描述】:
我正在尝试使用 mock 和 pytest-asyncio 编写单元测试用例。我有一个使用asyncio.run 启动异步协程的正常功能。 [使用python3.7]
import asyncio
async def sample_async(arg2):
# do something
proc = await asyncio.create_subprocess_shell(arg2)
# some more asyncio calls
rc = proc.returncode
return rc
def launcher(arg1, arg2):
if arg1 == "no_asyncio":
# do something
print("No asyncio")
return 0
else:
return_code = asyncio.run(sample_async(arg2))
# do something
return return_code
我能够为 asyncio 函数 sample_async 编写单元测试,但不能为 launcher 编写单元测试。这是我尝试过的:
class AsyncMock(MagicMock):
async def __call__(self, *args, **kwargs):
return super(AsyncMock, self).__call__(*args, **kwargs)
@patch("asyncio.create_subprocess_shell", new_callable=AsyncMock)
def test_launcher(async_shell):
arg1 = "async"
arg2 = "/bin/bash ls"
sample.launcher(arg1, arg2)
async_shell.assert_called_once()
当我尝试运行 pytest 时,我不断收到 RuntimeError: There is no current event loop in thread 'MainThread'. 我无法在此测试中使用 @pytest.mark.asyncio,因为函数 launcher 不是异步协程。我在这里做错了什么?
【问题讨论】:
标签: python-asyncio pytest-asyncio