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() 等等),但链接的文档应该涵盖所有这些。