我需要在单元测试中模拟以下方法。
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'JSON对象必须是str、bytes或byterarray,'TypeError:JSON对象必须是str、字节或字节数组,而不是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的同时运行我的单元测试用例@补丁在这种情况下不会起作用,因为每次http.client.HTTPSConnection(url(都会创建新的Mock对象。因此创建了模拟请求、响应和消息类。
作为创建的新模拟类
from MockHTTPResponse import mock_response
def mock_http_connon(self(:
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。