如何从call_args_list传递给各种调用的参数?

时间:2018-02-22 20:36:30

标签: python function unit-testing testing mocking

我尝试使用call_args_list来获取多次调用时传递给某个函数的参数。我用这个:

call_args_list = mock.add_row.call_args_list

然后我得到一个如下所示的列表:[call('A', []), call('B', []), call('C', ['err'])]

如果我只想检查第二个调用在第二个参数中是否有错误而第三个调用没有错误,我需要以某种方式访问​​调用中的项目。有谁知道如何剥离这些调用对象以获取内部项目?

3 个答案:

答案 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])