unittest.mock
中的Mock
与MagicMock
unittest.mock
模块中的 Mock
和 MagicMock
类都是用于模拟对象的类,可以用于测试中替代真实的对象。
Mock
类是 MagicMock
类的基类,它提供了一些基本的模拟功能,例如属性访问、方法调用等。MagicMock
类在 Mock
类的基础上增加了一些魔法方法,使得它可以更方便地模拟对象的行为。下面是一些常用的方法和属性:
mock.assert_called()
:断言 mock 对象是否被调用过。mock.assert_called_once()
:断言 mock 对象是否只被调用过一次。mock.assert_called_with(*args, **kwargs)
:断言 mock 对象是否被指定的参数调用过。mock.assert_not_called()
:断言 mock 对象是否没有被调用过。mock.return_value
:设置 mock 对象的返回值。mock.side_effect
:设置 mock 对象的副作用,可以是一个异常或一个函数。下面是一个示例:
from unittest.mock import Mock, MagicMock
# Mock 示例
mock_obj = Mock()
mock_obj.method.return_value = 42
result = mock_obj.method("foo", "bar")
assert result == 42
mock_obj.method.assert_called_once_with("foo", "bar")
# MagicMock 示例
magic_mock_obj = MagicMock()
magic_mock_obj.method.return_value = 42
result = magic_mock_obj.method("foo", "bar")
assert result == 42
magic_mock_obj.method.assert_called_once_with("foo", "bar")
在上面的示例中,Mock
和 MagicMock
类都被用于创建一个模拟对象,并设置了一个方法的返回值。然后调用该方法,并断言方法是否被正确调用。
需要注意的是,Mock
和 MagicMock
类的主要区别在于 MagicMock
类可以自动模拟任何属性和方法,而 Mock
类只能模拟已经存在的属性和方法。因此,在大多数情况下,建议使用 MagicMock
类。
下面是一个示例,用于说明 Mock
和 MagicMock
类的区别:
from unittest.mock import Mock, MagicMock
# Mock 示例
mock_obj = Mock()
mock_obj.foo = "bar"
assert mock_obj.foo == "bar"
mock_obj.method() # 抛出 AttributeError 异常
# MagicMock 示例
magic_mock_obj = MagicMock()
magic_mock_obj.foo = "bar"
assert magic_mock_obj.foo == "bar"
magic_mock_obj.method() # 不会抛出异常
在上面的示例中,首先创建了一个 Mock
对象和一个 MagicMock
对象,并分别设置了一个属性 foo
但是没有设置方法 method
。然后分别访问这些属性和方法。
在 Mock
对象中,访问已经存在的属性 foo
不会出现问题,但是访问不存在的方法 method
会抛出 AttributeError
异常。
在 MagicMock
对象中,访问已经存在的属性 foo
也不会出现问题,而且访问不存在的方法 method
也不会抛出异常,因为 MagicMock
类可以自动模拟任何属性和方法。
因此,当需要模拟一个对象的属性和方法时,建议使用 MagicMock
类。
如果本文对您有用,可以点赞、收藏本文哦,下次用到时就好找多了
如果能关注作者就太好了,作者将持续学习,持续输出,持续分享!谢谢鼓励!