这是一个最小的工作示例(假设您的方法放在 中http_call.py
):
from http_call import get_response
def test_get_response(mocker):
# mocked dependencies
mock_HTTPSConnection = mocker.MagicMock(name='HTTPSConnection')
mocker.patch('http_call.http.client.HTTPSConnection', new=mock_HTTPSConnection)
mock_HTTPSConnection.return_value.getresponse.return_value.status = 200
mock_HTTPSConnection.return_value.getresponse.return_value.read.return_value.decode.return_value = "some html goes here"
# act
data = get_response("GET", "www.google.com", '/', headers={})
# assert
assert "some html goes here" == data
该示例解释:
- 您模拟了 https 连接的“根”,即
HTTPSConnection
类。然后你必须确保你的响应是 200 并返回一些你可以断言的数据。
- 然后调用函数并获取输出
- 然后,您可以使用已模拟的预定义硬编码值断言输出
你可以在这个测试函数中做一些额外的事情:
添加断言,使用我的pytest-mock-generator库夹具,如下所示:
def test_get_response(mocker, mg):
# mocked dependencies
mock_HTTPSConnection = mocker.MagicMock(name='HTTPSConnection')
mocker.patch('http_call.http.client.HTTPSConnection', new=mock_HTTPSConnection)
mock_HTTPSConnection.return_value.getresponse.return_value.status = 200
mock_HTTPSConnection.return_value.getresponse.return_value.read.return_value.decode.return_value = "some html goes here"
# act
data = get_response("GET", "www.google.com", '/', headers={})
# assert
assert "some html goes here" == data
# this code generates extra asserts
mg.generate_asserts(mock_HTTPSConnection)
这将生成输出(打印到控制台并复制到剪贴板):
assert 1 == mock_HTTPSConnection.call_count
mock_HTTPSConnection.assert_called_once_with('www.google.com')
mock_HTTPSConnection.return_value.request.assert_called_once_with('GET', '/', body=None, headers={})
mock_HTTPSConnection.return_value.getresponse.assert_called_once_with()
mock_HTTPSConnection.return_value.getresponse.return_value.read.assert_called_once_with()
mock_HTTPSConnection.return_value.getresponse.return_value.read.return_value.decode.assert_called_once_with('utf-8')
mock_HTTPSConnection.return_value.close.assert_called_once_with()
这些额外的断言可以帮助您确保使用正确的参数调用函数。
我的库可以做的另一件事是通过分析您的代码来生成初始模拟,如下所示:
def test_get_response(mocker, mg):
mg.generate_uut_mocks(get_response)
你会得到这个输出:
# mocked dependencies
mock_HTTPSConnection = mocker.MagicMock(name='HTTPSConnection')
mocker.patch('http_call.http.client.HTTPSConnection', new=mock_HTTPSConnection)
mock_Exception = mocker.MagicMock(name='Exception')
mocker.patch('http_call.Exception', new=mock_Exception)
mock_str = mocker.MagicMock(name='str')
mocker.patch('http_call.str', new=mock_str)
显然不需要嘲笑Exception
and str
,所以你可以放弃这些建议。