unittest.mock中的Mock与MagicMock

unittest.mock中的MockMagicMock

unittest.mock 模块中的 MockMagicMock 类都是用于模拟对象的类,可以用于测试中替代真实的对象。

  • 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")

在上面的示例中,MockMagicMock 类都被用于创建一个模拟对象,并设置了一个方法的返回值。然后调用该方法,并断言方法是否被正确调用。

需要注意的是,MockMagicMock 类的主要区别在于 MagicMock 类可以自动模拟任何属性和方法,而 Mock 类只能模拟已经存在的属性和方法。因此,在大多数情况下,建议使用 MagicMock 类。


两者的区别

下面是一个示例,用于说明 MockMagicMock 类的区别:

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 类。


如果本文对您有用,可以点赞、收藏本文哦,下次用到时就好找多了
如果能关注作者就太好了,作者将持续学习,持续输出,持续分享!谢谢鼓励!

你可能感兴趣的:(python,单元测试,unittest)