Python mock 侧效应返回值

0 投票
1 回答
5840 浏览
提问于 2025-04-18 13:44

我正在尝试测试一些代码,这些代码会进行外部调用。我想要模拟这个调用。这个调用需要一些关键字参数,所以我在我的测试中写了一个小助手函数:

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 个回答

3

这个 Mock 对象其实会记录它被调用时传入的参数,所以你不需要自己写一个函数来做这个事情。你可以直接通过 Mock.call_args 来获取这些参数,或者使用 assert_called_with 来检查这个 mock 对象是否是用特定的参数被调用的。

示例:

>>> 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)

撰写回答