博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python中Mock和MagicMock的区别
阅读量:6262 次
发布时间:2019-06-22

本文共 1542 字,大约阅读时间需要 5 分钟。

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

转载地址:http://eshsa.baihongyu.com/

你可能感兴趣的文章
远程共享文件夹
查看>>
[转] C/C++中printf和C++中cout的输出格式
查看>>
swift 如何实现点击view后显示灰色背景
查看>>
【Android】3.9 覆盖物功能
查看>>
MySQL也有潜规则 – Select 语句不加 Order By 如何排序?
查看>>
搭建SolrCloud的详细步骤
查看>>
svn的安装与使用
查看>>
基于Linux下Iptables限制BT下载的研究
查看>>
Android对话框-中篇-之建立自己的对话框
查看>>
华为交换机VRP用户界面配置及Telnet登录实验
查看>>
作为一个程序员我最大的遗憾
查看>>
《SolidWorks 2012中文版从入门到精通》一6.5 综合实例——斜齿圆柱齿轮
查看>>
storm集群的监控
查看>>
RHCE 6.0学习笔记-2 RHEL 6 使用光盘配置本地YUM源
查看>>
Mongodb定期备份
查看>>
Confluence 6 数据库设置
查看>>
刨根问底-struts-怎么加载配置的相应的信息
查看>>
解决mysql数据库大小写敏感问题
查看>>
《.NET最佳实践》与Ext JS/Touch的团队开发
查看>>
jsp页面组成
查看>>