Python 模拟对象可以 return 给它的参数吗?
Can a Python mock object return the params it was given?
我正在测试向服务器发出 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))
根据我的测试,我想根据数据变量进行断言。我不想触及生产代码(即,我不想使方法 return 显式成为数据)。有没有办法模拟 make_request 方法,但 return 参数作为 return 值?类似于:
service.make_request = MagicMock(return_value=params)
如果我理解正确的话,您想在不更改代码的情况下测试 get_data()
产品中的行为。
来自 mock
framework you can use make_request(data)
as sensor point and call_args
to extract data
(details at 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()
等等),但链接的文档应该涵盖所有这些。
我正在测试向服务器发出 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))
根据我的测试,我想根据数据变量进行断言。我不想触及生产代码(即,我不想使方法 return 显式成为数据)。有没有办法模拟 make_request 方法,但 return 参数作为 return 值?类似于:
service.make_request = MagicMock(return_value=params)
如果我理解正确的话,您想在不更改代码的情况下测试 get_data()
产品中的行为。
来自 mock
framework you can use make_request(data)
as sensor point and call_args
to extract data
(details at 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()
等等),但链接的文档应该涵盖所有这些。