Python:如何使用 json.load 模拟 HTTPSConnection 请求和响应对象

Python: How to mock HTTPSConnection request and response object using json.load

我需要在单元测试中模拟以下方法。

def get_app_info(role):
  conn = http.client.HTTPSConnection(url)
  conn.request(
      method="GET",
      url="/v1/profile",
      headers={
          "appName": app["name"],
          "appRole": role
      }
  )

  response = conn.getresponse()
  res_data = json.load(response)
  conn.close()

  return res_data

我试图修补 @patch('http.client.HTTPSConnection'),所以请求是模拟的,但它在 json.load 失败并出现以下错误。

raise TypeError(f'the JSON object must be str, bytes or bytearray, ' TypeError: the JSON object must be str, bytes or bytearray, not MagicMock

我试过如下模拟

def mocked_response(*args, **kwargs):
class MockResponse:
    def __init__(self, json_data, status_code):
        self.json_data = json_data
        self.status_code = status_code

    def json(self):
        return self.json_data

return MockResponse(
    {
            "url": "/test/home
        },
        200)

class MyGreatClassTestCase(unittest.TestCase):

@patch('http.client.HTTPSConnection')
@patch('http.client.HTTPResponse')
def test_retrive_token(self, mock_con, mock_resp,  side_effect = mocked_response):

    json_data = common.retrieve_access_token("sometoken")
    print(json_data)

非常感谢任何意见。

我能够在模拟 HTTPSConnection 和 HTTPResponse 时 运行 我的单元测试用例。 @patch 在这种情况下不起作用,因为每次 http.client.HTTPSConnection(url) 都会创建新的 Mock 对象。因此创建了模拟请求、响应和消息 类.

新模拟 类 创建为

from MockHTTPResponse import mock_response

def mock_http_connon(自己):

class MockHTTPSConnection(object):
    print(object)
    def request(method, url, body, headers):
        print('request is executed')

    def headers(self):
        return "content-type", "accept"

    def getresponse():
        return mock_response()

    def close():
        print("close MockHTTPSConnection")

return MockHTTPSConnection

类似 MockResponse 和 MockMessage。