gpt4 book ai didi

python - 如何在 Pytest 中模拟 httpx.AsyncClient()

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

我需要为用于从 API 获取数据的函数编写测试用例。在那里我使用 httpx.AsyncClient() 作为上下文管理器。但我不明白如何为该功能编写测试用例。

async def make_dropbox_request(url, payload, dropbox_token):
async with httpx.AsyncClient(timeout=None, follow_redirects=True) as client:
headers = {
'Content-Type': 'application/json',
'authorization': 'Bearer '+ dropbox_token
}
# make the api call
response = await client.post(url, headers=headers, json=payload)

if response.status_code not in [200]:
print('Dropbox Status Code: ' + str(response.status_code))

if response.status_code in [200, 202, 303]:
return json.loads(response.text)

elif response.status_code == 401:
raise DropboxAuthenticationError()

elif response.status_code == 429:
sleep_time = int(response.headers['Retry-After'])
if sleep_time < 1*60:
await asyncio.sleep(sleep_time)
raise DropboxMaxRateLimitError()
raise DropboxMaxDailyRateLimitError()

raise DropboxHTTPError()

我需要在不调用 API 的情况下编写测试用例。所以我相信在这种情况下我需要模拟 client.post() 但我不知道该怎么做。如果有人可以帮助我解决这个问题,那对我来说真的很有帮助。

This image also include my code block

最佳答案

TL;DR:使用 return_value.__aenter__.return_value 模拟异步上下文。

假设您使用的是 Pytestpytest-mock ,您可以使用 mocker fixture 来模拟 httpx.AsyncClient

由于 post 函数是异步的,因此您需要使用 AsyncMock。最后,由于您使用异步上下文,因此您还需要使用 return_value.__aenter__.return_value 来正确模拟返回的上下文。请注意,对于同步上下文,只需使用 __enter__ 而不是 __aenter__

@pytest.fixture
def mock_AsyncClient(mocker: MockerFixture) -> Mock:
mocked_AsyncClient = mocker.patch(f"{TESTED_MODULE}.AsyncClient")

mocked_async_client = Mock()
response = Response(status_code=200)
mocked_async_client.post = AsyncMock(return_value=response)
mocked_AsyncClient.return_value.__aenter__.return_value = mocked_async_client

return mocked_async_client

关于python - 如何在 Pytest 中模拟 httpx.AsyncClient(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70633584/

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