非同期API呼び出しをモックする方法を理解するのに苦労したので、この情報を追加します。
これが非同期呼び出しを模擬するために行ったものです。
これが私がテストしたかった機能です
async def get_user_info(headers, payload):
return await httpx.AsyncClient().post(URI, json=payload, headers=headers)
MockResponseクラスがまだ必要です
class MockResponse:
def __init__(self, json_data, status_code):
self.json_data = json_data
self.status_code = status_code
def json(self):
return self.json_data
MockResponseAsyncクラスを追加します
class MockResponseAsync:
def __init__(self, json_data, status_code):
self.response = MockResponse(json_data, status_code)
async def getResponse(self):
return self.response
これがテストです。ここで重要なことは、init関数を非同期にすることはできず、getResponseの呼び出しが非同期であるためすべてをチェックアウトするため、以前に応答を作成することです。
@pytest.mark.asyncio
@patch('httpx.AsyncClient')
async def test_get_user_info_valid(self, mock_post):
"""test_get_user_info_valid"""
# Given
token_bd = "abc"
username = "bob"
payload = {
'USERNAME': username,
'DBNAME': 'TEST'
}
headers = {
'Authorization': 'Bearer ' + token_bd,
'Content-Type': 'application/json'
}
async_response = MockResponseAsync("", 200)
mock_post.return_value.post.return_value = async_response.getResponse()
# When
await api_bd.get_user_info(headers, payload)
# Then
mock_post.return_value.post.assert_called_once_with(
URI, json=payload, headers=headers)
あなたがそれを行うより良い方法を持っているなら教えてくださいが、それはそのようにかなりきれいだと思います。