gpt4 book ai didi

python - 测试和模拟使用 async with 语句的异步代码

转载 作者:行者123 更新时间:2023-12-05 05:06:06 27 4
gpt4 key购买 nike

我有一个简单的异步函数,可以从网络中获取 JSON:

async def fetch (session : aiohttp.ClientSession, url : str, pageSize : int = 100, pageNumber : int = 0):
async with session.get(url, params={'pageSize' : f"{pageSize}", 'pageNumber' : f"{pageNumber}"}) as response:
return await response.json()

如何为它编写单元测试?我目前正在学习如何在 Python 中执行此操作,并且我已经决定使用 unittestaiounittest 模块。我用于测试的脚手架如下:

class AsyncTest(aiounittest.AsyncTestCase):
async def test_fetch(self):
mocked_session = ... #no idea how to create
json = await fetch(mocked_session, "url_for_mock", 10, 0)

我想我将不得不使用 unittest.Mock() 功能以某种方式模拟 session 参数以返回一些硬编码的 json 数据,但我对如何做有点迷茫这样做以便它在 async with 语句中工作。我从未在 Python 中使用过单元测试库,这里的示例会很有帮助。我正在使用 Python 3.8 和 aiohttp 进行联网。

最佳答案

我能够通过实现我自己版本的 __aenter__ 魔术方法并使用 AsyncMock 模拟相关的 async 方法来模拟异步资源管理器.模拟网络调用的概念验证测试如下所示:

class AsyncTest(aiounittest.AsyncTestCase):
async def test_fetch(self):

request_mock = AsyncMock()
request_mock.__aenter__.return_value = request_mock
request_mock.json.return_value = { 'hello' : 'world'}

session = Mock()
session.get.return_value = request_mock

json = await fetch(session, "url_for_mock", 10, 0)

关于python - 测试和模拟使用 async with 语句的异步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60142034/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com