如何使用 unittest.mock.call 在 Python 中模拟函数的调用

2023-04-13 00:00:00 函数 调用 如何使用

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 是一个十分有用的函数,可以方便地模拟函数的调用,便于我们进行单元测试。

相关文章