我正在测试一个向服务器发出HTTP请求的Python方法。该方法如下所示:
def do_something():
data = get_data()
make_request(data)
def make_request(self, data):
self.send_response(200)
self.wfile.write(json.dumps(msg))
从我的测试中,我想基于数据变量断言。我不想触摸生产代码(即,我不想让方法明确地返回数据)。有没有办法可以模拟make_request方法,但返回params作为返回值?类似的东西:
service.make_request = MagicMock(return_value=params)
答案 0 :(得分:0)
如果我理解正确,您希望在不更改代码的情况下测试生产中的get_data()
行为。
通过mock
框架,您可以使用make_request(data)
作为传感器点,call_args
来提取data
(详情请见calls as tuples)。
简单示例:
def extract_data(mock_make_request):
"""Helper function that return data passed to make_request() mock
Check also if you have some calls and then reset it"""
assert mock_make_request.called
args, kwargs = mock_make_request.call_args
mock_make_request.reset_mock()
try:
return kwargs['data']
except TypeError:
return args[0]
@patch("productioncodemodule.make_request")
def test_data(mock_make_request):
"""... your code that make do_something() call..."""
data = extract_data(mock_make_request)
"""... your assert here..."""
此处有太多详细信息(patch
装饰器,reset_mock()
等),但链接文档应涵盖所有这些内容。