【问题标题】:Can a Python mock object return the params it was given?Python 模拟对象可以返回给定的参数吗?
【发布时间】:2016-02-10 16:23:24
【问题描述】:

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

【问题讨论】:

  • 只要设置wraps,就会调用。

标签: python-2.7 testing mocking magicmock


【解决方案1】:

如果我理解正确,您想在生产中测试 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() 等等),但链接的文档应该涵盖所有这些。

【讨论】:

  • 谢谢;使用 call_args,这对我有用。我能够看到通过模拟对象上的 call_args 调用传递给模拟出来的方法的参数
猜你喜欢
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多