Вызовите реальный метод, используя фиктивный объект в Python - PullRequest
0 голосов
/ 13 февраля 2020

Я работал над издевательством в 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)

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

...