python模拟副作用返回值

python模拟副作用返回值,python,testing,mocking,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 tes

我正在尝试测试一些进行外部调用的代码。我想嘲笑你的叫喊。调用采用关键字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
在测试类的设置函数中,我有:

@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_函数获得打印输出,因此我知道我正确地模拟了该函数。我的问题是:


如何获取在mock_函数中创建的io_obj?我的外部函数不返回任何内容。

模拟对象实际上捕获了调用它的参数,因此不需要编写自己的函数来实现这一点。您可以使用直接访问参数,也可以使用断言使用某些参数调用了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)
>m=mock.mock()
>>>m(1,2,3)
>>>m.call_args
呼叫(1、2、3)
>>>m.assert_称为_(1,2,4)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib64/python2.6/site packages/mock.py”,第835行,在assert_中使用
引发断言错误(msg)
AssertionError:预期调用:mock(1,2,4)
实际调用:模拟(1、2、3)

模拟对象实际上捕获了调用它时使用的参数,因此不需要编写自己的函数来实现这一点。您可以使用直接访问参数,也可以使用断言使用某些参数调用了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)
>m=mock.mock()
>>>m(1,2,3)
>>>m.call_args
呼叫(1、2、3)
>>>m.assert_称为_(1,2,4)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib64/python2.6/site packages/mock.py”,第835行,在assert_中使用
引发断言错误(msg)
AssertionError:预期调用:mock(1,2,4)
实际调用:模拟(1、2、3)

模拟对象实际上捕获了调用它时使用的参数,因此不需要编写自己的函数来实现这一点。您可以使用直接访问参数,也可以使用断言使用某些参数调用了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)
>m=mock.mock()
>>>m(1,2,3)
>>>m.call_args
呼叫(1、2、3)
>>>m.assert_称为_(1,2,4)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib64/python2.6/site packages/mock.py”,第835行,在assert_中使用
引发断言错误(msg)
AssertionError:预期调用:mock(1,2,4)
实际调用:模拟(1、2、3)

模拟对象实际上捕获了调用它时使用的参数,因此不需要编写自己的函数来实现这一点。您可以使用直接访问参数,也可以使用断言使用某些参数调用了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)
>m=mock.mock()
>>>m(1,2,3)
>>>m.call_args
呼叫(1、2、3)
>>>m.assert_称为_(1,2,4)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib64/python2.6/site packages/mock.py”,第835行,在assert_中使用
引发断言错误(msg)
AssertionError:预期调用:mock(1,2,4)
实际调用:模拟(1、2、3)

一旦有了关键字参数,您想如何处理它们?我想将io_obj中的值与我期望的值进行比较(assert_equals)。模拟将捕获传入的所有参数。为什么需要一个助手,为什么整个舞蹈都是一个
StringIO()
对象?好吧,听起来你只是想要,甚至只是你把它作为一个答案,我会接受的。我想StringIO可能会做一个更强大的测试,一旦你有了关键字参数,你想对它们做什么?我想比较(assert_equals)io_obj中的值和我期望的值。模拟将捕获传入的所有参数。为什么需要一个助手,为什么整个舞蹈都是一个
StringIO()
对象?好吧,听起来你只是想要,甚至只是你把它作为一个答案,我会接受的。我想StringIO可能会做一个更强大的测试,一旦你有了关键字参数,你想对它们做什么?我想比较(assert_equals)io_obj中的值和我期望的值。模拟将捕获传入的所有参数。为什么需要一个助手,为什么整个舞蹈都是一个
StringIO()
对象?好吧,听起来你只是想要,甚至只是你把它作为一个答案,我会接受的。我想StringIO可能会做一个更强大的测试,一旦你有了关键字参数,你想对它们做什么?我想比较(assert_equals)io_obj中的值和我期望的值。模拟将捕获传入的所有参数。为什么需要一个助手,为什么整个舞蹈都是一个
StringIO()
对象?好吧,听起来你只是想要,甚至只是你把它作为一个答案,我会接受的。我想StringIO可能会做一个更强的测试