Использование декоратора для добавления аргумента в метод ⇐ Python
-
Anonymous
Использование декоратора для добавления аргумента в метод
Я работаю над проектом, который выполняет вызовы API GET и POST. Это выполняется с использованием пакета request.Session. Вызовы API выполняются во многих классах.
Я пишу тест, который будет выполнять основной код, но когда дело доходит до определенного класса, я хочу добавить базовую аутентификацию к запросам GET или POST.
Моей идеей было использовать издевательство. Я бы исправил вызов request.Session, добавил аутентификацию к аргументам, выполнил вызов и вернул ответ обратно на исходный вызов в этом конкретном классе.
Проблема в том, что я хочу сделать это только для определенного класса, а не для каждого места, где требуется запрос. Сессия вызывается во время выполнения основного кода. Я не могу изменить класс, к которому стремлюсь, поскольку он принадлежит другой библиотеке.
Я пробовал использовать декоратор для основного вызова, который включает в себя исправление этого конкретного пакета. В этом примере я печатаю аргументы только для того, чтобы увидеть, как далеко я смогу зайти. Проблема в том, что я не могу изменить патч, чтобы он фиксировал только вызов FirstClass:
из патча импорта unittest.mock запросы на импорт класс ПервыйКласс: def make_request(self, url,verify_ssl=True, headers=None): с запросами.Session() в качестве сеанса: session.get(url, заголовки=заголовки) класс ВторойКласс: def make_request(self, url,verify_ssl=True, headers=None): с запросами.Session() в качестве сеанса: session.get(url, заголовки=заголовки) декоратор защиты (функция): def декорированная_функция (*args, **kwargs): с patch("requests.Session.get") как fake_get: печать(ул(кварг)) return func(*args, **kwargs) вернуть декорированную_функцию первый_класс = ПервыйКласс() второй_класс = Второйкласс() @setup_xdr_agent_test_mode def test_func(экземпляр, URL, **kwargs): экземпляр.make_request(url, **kwargs) test_func(first_class, "https://httpbin.org/status/200",verify_ssl=True, headers={'User-Agent': 'MyApp/1.0'}) test_func(второй_класс, "https://httpbin.org/status/200",verify_ssl=True, headers={'User-Agent': 'MyApp/1.0'}) Возможно, я что-то упускаю или просто веду себя глупо, и есть более простой способ сделать это. Буду рад любым советам.
Я работаю над проектом, который выполняет вызовы API GET и POST. Это выполняется с использованием пакета request.Session. Вызовы API выполняются во многих классах.
Я пишу тест, который будет выполнять основной код, но когда дело доходит до определенного класса, я хочу добавить базовую аутентификацию к запросам GET или POST.
Моей идеей было использовать издевательство. Я бы исправил вызов request.Session, добавил аутентификацию к аргументам, выполнил вызов и вернул ответ обратно на исходный вызов в этом конкретном классе.
Проблема в том, что я хочу сделать это только для определенного класса, а не для каждого места, где требуется запрос. Сессия вызывается во время выполнения основного кода. Я не могу изменить класс, к которому стремлюсь, поскольку он принадлежит другой библиотеке.
Я пробовал использовать декоратор для основного вызова, который включает в себя исправление этого конкретного пакета. В этом примере я печатаю аргументы только для того, чтобы увидеть, как далеко я смогу зайти. Проблема в том, что я не могу изменить патч, чтобы он фиксировал только вызов FirstClass:
из патча импорта unittest.mock запросы на импорт класс ПервыйКласс: def make_request(self, url,verify_ssl=True, headers=None): с запросами.Session() в качестве сеанса: session.get(url, заголовки=заголовки) класс ВторойКласс: def make_request(self, url,verify_ssl=True, headers=None): с запросами.Session() в качестве сеанса: session.get(url, заголовки=заголовки) декоратор защиты (функция): def декорированная_функция (*args, **kwargs): с patch("requests.Session.get") как fake_get: печать(ул(кварг)) return func(*args, **kwargs) вернуть декорированную_функцию первый_класс = ПервыйКласс() второй_класс = Второйкласс() @setup_xdr_agent_test_mode def test_func(экземпляр, URL, **kwargs): экземпляр.make_request(url, **kwargs) test_func(first_class, "https://httpbin.org/status/200",verify_ssl=True, headers={'User-Agent': 'MyApp/1.0'}) test_func(второй_класс, "https://httpbin.org/status/200",verify_ssl=True, headers={'User-Agent': 'MyApp/1.0'}) Возможно, я что-то упускаю или просто веду себя глупо, и есть более простой способ сделать это. Буду рад любым советам.