Это пример того, почему вы хотите избежать тестирования соавторов.Если вы спросите "что происходит, когда WOW_CLIENT_ID
недействительно?"это подразумевает проверку поведения aiohttp.ClientSession
, потому что это то, что проверяет идентификатор.Вместо этого, подумайте о том, как ClientSession
может произойти сбой, когда вы используете его таким образом, запустите это поведение в своих тестах, используя внедрение зависимостей и насмешки, и проверьте, что вы обрабатываете его, как вам нужно.
Итаквместо того, чтобы создавать сеанс клиента в функции, вы можете передать его в качестве параметра:
async def get_access_token(client):
auth_path = 'https://us.battle.net/oauth/token'
try:
async with client.get(auth_path, params={'grant_type': 'client_credentials'}) as auth_response:
assert auth_response.status == 200
auth_json = await auth_response.json()
return auth_json['access_token']
# etc.
И затем вы создадите объект в своем тесте, который генерирует исключение ClientSession
с недопустимыми параметрами.
Вы можете создать свой фальшивый объект следующим образом:
class MockSession:
def __init__(self):
pass
def get(pathname, params):
raise aoihttp.InvalidURL
и использовать его в таком тесте, как этот
class TestAccessToken(unittest.TestCase):
def test_handle_invalid_url(self):
invalid_client = MockSession()
self.assertIsNone(get_access_token(invalid_client)) # or whatever you want to happen
unittest.mock
дает вам простой способнастроить это поведение без необходимости создания объекта.Например,
from unittest import mock
class TestAcccessToken(unittest.TestCase):
def test_invalid_url(self):
# Create a mock client that raises InvalidUrl when you call `get()` on it
client = mock.MagicMock()
client.get = mock.Mock(side_effect=KeyError())
self.assertIsNone(get_access_token(client))
(Расширенные функции насмешки, вероятно, могут помочь вам без изменения кода, но обычно мне проще всего передать соавторов, как показано выше.)