mock.call的使用技巧及注意事项(Python)
在Python中,mock库是一个强大的模拟和测试库,可以帮助我们编写单元测试,特别是在测试函数调用和交互时非常有用。其中一个重要的功能是mock.call,它可以用于验证函数的调用和参数。
mock.call的使用技巧如下:
1. 验证函数的调用次数:可以使用mock.call_count属性来获取函数被调用的次数。例如,使用assertEqual来验证函数被调用了一次:
from unittest import mock
def foo():
print("called")
mocked = mock.Mock()
foo()
mocked.assert_called_once()
2. 验证函数的参数:可以使用mock.call_assert_called_with方法来验证函数被调用时的参数。例如,使用assert_called_with来验证foo函数被调用时的参数是"hello":
from unittest import mock
def foo(arg):
print(arg)
mocked = mock.Mock()
foo("hello")
mocked.assert_called_with("hello")
3. 验证函数的多次调用:可以使用mock.call_args_list属性来获取函数的调用参数列表。例如,使用assert_called_once_with来验证foo函数被调用了两次,且 次调用参数是"hello",第二次调用参数是"world":
from unittest import mock
def foo(arg):
print(arg)
mocked = mock.Mock()
foo("hello")
foo("world")
mocked.assert_called_once_with("hello")
mocked.assert_called_once_with("world")
4. 验证函数的调用顺序:可以使用mock.call_args属性来获取函数的调用参数。例如,使用assert_has_calls来验证foo函数被调用的顺序和调用参数。注意参数列表的顺序要与函数调用的顺序保持一致:
from unittest import mock
def foo(arg):
print(arg)
mocked = mock.Mock()
foo("hello")
foo("world")
mocked.assert_has_calls([
mock.call("hello"),
mock.call("world")
])
注意事项如下:
1. 使用mock.call时,必须使用mock库中的Mock类来创建一个模拟对象,然后对模拟对象进行调用和验证。
2. 确保mock.call的参数和函数调用的参数匹配,包括参数的值、顺序、个数等。
3. 使用mock.call时,一定要在验证之前进行函数的调用,否则无法验证。
4. 对于多次调用的函数,可以使用mock.call_args_list来获取参数列表,并逐个验证。
5. 对于函数调用顺序的验证,可以使用mock.call_args和mock.assert_has_calls来实现。
下面是一个使用mock.call的例子,用于测试一个计算器函数add的调用和参数:
from unittest import TestCase, mock
def add(a, b):
return a + b
class AddTestCase(TestCase):
def test_add(self):
mocked = mock.Mock()
mocked.add(1, 2)
mocked.add(3, 4)
mocked.assert_has_calls([
mock.call.add(1, 2),
mock.call.add(3, 4)
])
self.assertEqual(mocked.add.call_count, 2)
在上面的例子中,我们使用mock.Mock创建了一个模拟对象mocked,并对其add方法进行了多次调用。然后我们使用mock.call和mock.assert_has_calls来验证函数的调用和参数。最后,使用mocked.add.call_count来验证函数的调用次数。
mock.call是mock库中非常有用的一个功能,可以帮助我们编写更加灵活的单元测试,特别是在验证函数调用和参数时。需要注意的是,确保参数的值、顺序和个数与函数调用一致,以及在验证之前进行函数的调用。
