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


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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡与乌龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值