Я работал над издевательством в 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)
Понятно, что создание объекта для вызова метода невозможно как объект создание требует много аргументов.