Python模拟对象可以返回它给出的参数吗?

时间:2016-02-10 16:23:25

标签: python-2.7 testing mocking magicmock

我正在测试一个向服务器发出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)

1 个答案:

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