如何使用 unittest.mock.call 在 Python 中模拟函数的调用
unittest.mock.call 用于模拟函数的调用,通常用于测试函数的返回值或异常情况。
调用格式为:
unittest.mock.call(*args, **kwargs)
其中,args 表示位置参数列表,*kwargs 表示关键字参数字典。
假设我们有一个函数 greet,接受一个字符串参数 name,返回“Hello, name!” 的招呼语。
def greet(name): return f'Hello, {name}!'
现在我们想要测试这个函数在不同参数下的返回值是否正确。我们可以使用 unittest.mock.call 模拟函数的调用,示例代码如下:
import unittest.mock def test_greet(): with unittest.mock.patch('__main__.greet') as mock_greet: mock_greet.return_value = 'Hello, Kaiser!' greet('Kaiser') mock_greet.assert_called_once_with('Kaiser')
其中,unittest.mock.patch 函数将 greet 函数替换为一个 Mock 对象 mock_greet。我们设置 mock_greet.return_value 为 'Hello, Kaiser!',表示 greet('Kaiser') 的返回值为 'Hello, Kaiser!'。接下来使用 mock_greet.assert_called_once_with('Kaiser') 验证 mock_greet 被调用一次,且参数为 'Kaiser'。
我们也可以使用 unittest.mock.call 模拟多次函数调用,示例代码如下:
def test_greet_multiple_calls(): with unittest.mock.patch('__main__.greet') as mock_greet: mock_greet.return_value = 'Hello, Kaiser!' greet('Kaiser') greet('Victoria') assert mock_greet.call_count == 2 mock_greet.assert_has_calls([unittest.mock.call('Kaiser'), unittest.mock.call('Victoria')])
其中,使用 mock_greet.call_count 检查 mock_greet 被调用的次数,使用 mock_greet.assert_has_calls 验证 mock_greet 被调用两次,参数分别为 'Kaiser' 和 'Victoria'。其中,unittest.mock.call('Kaiser') 和 unittest.mock.call('Victoria') 分别表示 greet 函数被调用时的参数。
总之,unittest.mock.call 是一个十分有用的函数,可以方便地模拟函数的调用,便于我们进行单元测试。
相关文章