0

我正在测试一种向服务器发出 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 方法,但将参数作为返回值返回?就像是:

service.make_request = MagicMock(return_value=params)
4

1 回答 1

0

如果我理解正确,您想get_data()在不更改代码的情况下测试生产中的行为。

通过mock框架,您可以将make_request(data)其用作传感器点并call_args提取data调用时的详细信息为元组)。

简单的例子:

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

于 2016-02-11T12:49:37.697 回答