我尝试使用call_args_list来获取多次调用时传递给某个函数的参数。我用这个:
call_args_list = mock.add_row.call_args_list
然后我得到一个如下所示的列表:[call('A', []), call('B', []), call('C', ['err'])]
。
如果我只想检查第二个调用在第二个参数中是否有错误而第三个调用没有错误,我需要以某种方式访问调用中的项目。有谁知道如何剥离这些调用对象以获取内部项目?
答案 0 :(得分:1)
它似乎没有(很好)记录,但是mock
定义了一个名为tuple
的{{1}}的子类,其实例就是您在_Call
中看到的。第一个元素是函数的名称,第二个元素是位置参数的元组,第三个元素是关键字参数的字典。
答案 1 :(得分:1)
import unittest
import mock
class TestCase(unittest.TestCase):
def test_my_func(self):
m = mock.MagicMock()
m.add_row('A', [])
m.add_row('B', [])
m.add_row('C', ['err'])
calls = m.add_row.call_args_list
_first_arg, second_arg = calls[1][0]
self.assertNotEqual(second_arg, ['err'])
_first_arg, second_arg = calls[2][0]
self.assertEqual(second_arg, ['err'])
if __name__ == '__main__':
unittest.main()
答案 2 :(得分:1)
def test_call_args(self):
m = mock.Mock()
m.add_row('A', ['a', 'aa'])
m.add_row('B', ['b', 'bb', 'bbb'])
m.add_row('C', ['c', 'cc', 'ccc', 'err'])
# args is a tuple, the second call
args, kwargs = m.add_row.call_args_list[1]
# the second arg is a list
self.assertTrue('err' not in args[1])
# third call
args, kwargs = m.add_row.call_args_list[2]
self.assertTrue('err' in args[1])