Используйте несколько одновременных макеров / адаптеров с python request_mock - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь смоделировать службы для некоторых тестов, используя библиотеку 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 кажутся мешающими друг другу или что я могу сделать, чтобы избежать этого?

...