Я пытаюсь смоделировать службы для некоторых тестов, используя библиотеку requests_mock
. Для контроля, когда они действуют, я использую контекстные менеджеры. Тем не менее, я получаю неожиданную ошибку в том, что оба requests_mock.Mockers
/ requests_mock.Adapters
не могут работать одновременно, так как я получаю следующую ошибку:
requests_mock.exceptions.NoMockAddress: No mock address: GET
http://service_b.com/test
Мой код как показано ниже:
import requests_mock
class MockedService:
def __init__(self, mocker, url):
self.mocker = mocker
self.mocker.get(url, status_code=200)
def __enter__(self):
self.mocker.start()
def __exit__(*args):
self.mocker.stop()
mocked_service_a = MockedService(
requests_mock.Mocker(adapter=requests_mock.Adapter()),
'http://service_a.com/test'
)
mocked_service_b = MockedService(
requests_mock.Mocker(adapter=requests_mock.Adapter()),
'http://service_b.com/test'
)
with mocked_service_a, mocked_service_b:
requests.get('http://service_a.com/test')
requests.get('http://service_b.com/test')
Ни в одном экземпляре MockedService не был вызван метод __exit__
в момент возникновения ошибки, поэтому я ожидаю, что в это время будут существовать оба поддельных адреса. Если я изменю исполнение менеджеров контекста на следующее, то программа будет выполняться без ошибок:
with mocked_service_a:
requests.get('http://service_a.com/test')
with mocked_service_b:
requests.get('http://service_b.com/test')
Может кто-нибудь объяснить мне, почему эти два экземпляра Mocker / Adapter кажутся мешающими друг другу или что я могу сделать, чтобы избежать этого?