Вызов реального метода с использованием фиктивного объекта в Python

Я работал над насмешкой на Python. Я хочу издеваться над методом из класса с издевательским объектом. Вот пример:

MyApp.py

import requests

class Client:
    """
    Client to use in integration to fetch data from Chronicle Backstory
    requires service_account_credentials : a json formatted string act as a token access
    """
    def __init__(self, api_key, url, verify, proxies):
        self.url = url
        self.api_key = api_key
        self.verify = verify
        self.proxies = proxies
        # a separate SDK that has initialized the request object
        self.my_requests = requests

    def http_request(self, method, url_suffix, params=None):
        base_url = self.url + "/api/v4"
        full_url = base_url + url_suffix
        headers = {
            'Authorization': self.api_key
        }
        validate_response(self.my_requests.request(
            method,
            full_url,
            verify=self.verify,
            proxies=self.proxies,
            params=params,
            headers=headers))

def validate_response(response):
    status_code = response.status_code
    resp_json = response.json()
    if status_code != 200:
        raise ValueError("Invalid argument value  " + resp_json.get('detail', 'N/A'))
    else:
        response.raise_for_status()
    return resp_json

def request_api(client):
    response = client.http_request('GET', '')
    return response
# initial flow of execution

def main():
    client = Client()
    print(request_api(client))

if __name__ in ('__main__', '__builtin__', 'builtins'):
    main()

MyApp_test.py

from unittest import mock
def test_api_failure():
    from mocking.MyApp import request_api
    # lots of complexities here that we have to mock this object
    client = mock.Mock()
    client.http_request.call_real_method # something that I want to achieve.
    client.my_requests.request.return_value = '{"status":"ok"}'
    request_api(client)

Понятно, что создание объекта для вызова метода невозможно, так как создание объекта требует большого количества аргументов.


person Milan Sonagra    schedule 13.02.2020    source источник
comment
Почему вы используете макет здесь?   -  person Tal    schedule 13.02.2020
comment
Если ваша бизнес-логика зависит от состояния объекта (abc), то вам не следует вызывать настоящий метод или объект не должен быть макетом.   -  person rdas    schedule 13.02.2020
comment
@tal Это всего лишь пример, у меня есть другой вариант использования, когда создание реального объекта невозможно. но хочу вызвать метод.   -  person Milan Sonagra    schedule 13.02.2020
comment
Вы тестируете его неправильно, мы не сможем вам помочь без вашего реального кода (или хотя бы чего-то близкого к реальному коду)   -  person Tal    schedule 13.02.2020
comment
Хорошо, @Tal, позволь мне обновить.   -  person Milan Sonagra    schedule 13.02.2020
comment
Отвечает ли это на ваш вопрос? Имитация только одного метода объекта   -  person quamrana    schedule 13.02.2020
comment
@quamrana Milan хочет обратного - не высмеивать только один метод   -  person Tal    schedule 13.02.2020
comment
@Tal: Примените его дважды, по одному разу для каждого метода.   -  person quamrana    schedule 13.02.2020
comment
вам нужно издеваться только над методом requests.request, но почему вы сохраняете модуль как значение внутри экземпляра?   -  person Tal    schedule 13.02.2020
comment
Это отдельный SDK в моем коде. В качестве примера добавлен модуль запросов.   -  person Milan Sonagra    schedule 13.02.2020