资讯专栏INFORMATION COLUMN

Python中Mock和MagicMock的区别

TigerChain / 3364人阅读

摘要:也就是说,如果不需要,两者使用起来并没有什么分别。来看个例子,先定义个类,里面只有一个成员方法,返回倍的数值使用类来掉这个成员方法使用类来两者没有任何区别,都成功了了成员方法。再看下两者的区别因为使用类时,默认不会创建这个的,所以报错。

Python的unittest.mock模块中提供了两个主要的mock类,分别是MockMagicMock.

先看一下官方文档的定义:

MagicMock is a subclass of Mock with all the magic methods pre-created and ready to use.

其实已经很清楚了,MagicMock是Mock的子类,并且预先创建了全部magic method的mock。
也就是说,如果不需要mock magic method,两者使用起来并没有什么分别。

来看个例子,先定义个类,里面只有一个成员方法,返回10倍的数值:

class Person:
    def get_10_times_value(self, value)
        return 10 * value

使用Mock类来mock掉这个成员方法:

def test_should_mock_get_10_times_value_with_Mock(self):
    p = Person()
    p.get_10_times_value = Mock(return_value=100)
    
    self.assertEqual(p.get_10_times_value(), 100)

使用MagicMock类来mock:

def test_should_mock_get_10_times_value_with_MagicMock(self):
    p = Person()
    p.get_10_times_value = MagicMock(return_value=100)
    
    self.assertEqual(p.get_10_times_value(), 100)

两者没有任何区别,都成功了mock了成员方法。

再看下两者的区别:

def test_should_raise_exception(self):
    m = Mock()
    list(m)

TypeError: "Mock" object is not iterable

因为使用Mock类时,默认不会创建__iter__这个magic method的mock,所以报错。

如果想mock __iter__这个方法,得自己去做,如下:

def test_should_mock_magic_method_with_Mock(self):
    m = Mock()
    m.__iter__ = Mock(return_value=iter([]))
    
    self.assertEqual(list(m), [])

而使用MagicMock类时默认就会mock掉所有的magic method,所以不需要自己mock,__iter__默认是空数组:

def test_should_mock_magic_method_with_MagicMock(self):
    m = MagicMock()
    
    self.assertEqual(list(m), [])

因为已经默认创建了magic method的mock,所以可以直接使用return_value属性来改变值:

def test_should_mock_magic_method_with_MagicMock(self):
    m = MagicMock()
    m.__iter__.return_value = [1, 2, 3]
    
    self.assertEqual(list(m), [1, 2, 3])

其他magic method类似。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45539.html

相关文章

  • tornado异步mock以及装饰器

    摘要:非常适合写单元测试用它掉网络请求的返回值即可测试用的给上面的加装饰器放在上面这种一般的使用场景就是加缓存或者计时之类因为异步的里面是个所以最里面包的一层还是要加并且用返回 mock非常适合写单元测试, 用它patch掉网络请求的返回值即可 async_func.py #!/usr/bin/env python # -*- coding:utf-8 -*- import signal i...

    Chaz 评论0 收藏0
  • Python 模拟测试介绍

    摘要:接下来我们将介绍如何对对象的方法进行模拟测试。选项创建模拟测试接口我们可以在的构造函数中提供一个模拟测试实例,而不是模拟创建具体的模拟测试方法。 如何不靠耐心测试 通常,我们编写的软件会直接与那些我们称之为肮脏的服务交互。通俗地说,服务对我们的应用来说是至关重要的,它们之间的交互是我们设计好的,但这会带来我们不希望的副作用——就是那些在我们自己测试的时候不希望的功能。 比如,可能我们...

    BearyChat 评论0 收藏0
  • 代码测试用例指南

    摘要:测试的通用规则测试单元应该集中于小部分的功能,并且证明它是对的。通过去除依赖尽量使测试单元快速运行。实现来持续集成通过代码提交的本地或者来持续集成测试你的代码。 原文链接:http://blog.speedx.com/backend-test-guide 将测试代码和运行代码一起写是一种非常好的习惯。聪明地使用这种方法将会帮助你更加精确地定义代码的含义,并且代码的耦合性更低。 测试的通...

    chinafgj 评论0 收藏0
  • Python Mock入门

    摘要:准确的说,是中一个用于支持单元测试的库,它的主要功能是使用对象替代掉指定的对象,以达到模拟对象的行为。下面我们使用对象在单元测试中分别测试访问正常和访问不正常的情况。 Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西。准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python...

    Winer 评论0 收藏0
  • PythonMock示例

    摘要:一些常用的示例先简单定义个类,方便举例这个类里有两个成员方法,一个有参数,一个无参数。有个模块方法,返回数据库中所有指定的人员,并按排序掉整个数据库访问先得到一个的对象,再在中设置一个对象,此时不需要自己再创建 一些常用的mock示例 先简单定义个类,方便举例: class Person: def __init__(self): self.__age = 10 ...

    elva 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<