python模拟副作用返回值

时间:2014-07-17 16:33:25

标签: python testing mocking

我正在尝试测试一些进行外部调用的代码。我想嘲笑那个电话。调用带有关键字args,所以我在测试中编写了这个小帮助函数:

def mock_function(*args, **kwargs)
    io_obj = StringIO()
    for k,v in kwargs.iteritems():
        io_obj.write("{}: {}\n".format(k, v)
    print "\n{}".format(io_obj.getvalue()) # for testing purposes
    return io_obj

在我的测试类的setUp函数中,我有这个:

@patch('function_to_test')
def setUp(self, mock_dude):
    self.mock_client = mock_dude.return_value
    self.mock_client.function_to_test.side_effect = mock_function
    self.client = ClientClass()

在我的测试函数中,我正在调用调用外部函数的函数。 我从mock_function获得打印输出,所以我知道我正在嘲笑这个函数。我的问题是:

如何获得在mock_function中创建的io_obj?我的外部功能不会返回任何内容。

1 个答案:

答案 0 :(得分:1)

Mock对象实际上捕获了它所调用的参数,因此您不需要编写自己的函数来执行此操作。您可以使用Mock.call_args直接访问参数,或使用assert_called_with断言使用某些参数调用模拟。

示例:

>>> m = mock.Mock()
>>> m(1,2,3)
<Mock name='mock()' id='139905514719504'>
>>> m.call_args
call(1, 2, 3)
>>> m.assert_called_with(1,2,4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib64/python2.6/site-packages/mock.py", line 835, in assert_called_with
    raise AssertionError(msg)
AssertionError: Expected call: mock(1, 2, 4)
Actual call: mock(1, 2, 3)