摘要:也就是说,如果不需要,两者使用起来并没有什么分别。来看个例子,先定义个类,里面只有一个成员方法,返回倍的数值使用类来掉这个成员方法使用类来两者没有任何区别,都成功了了成员方法。再看下两者的区别因为使用类时,默认不会创建这个的,所以报错。
Python的unittest.mock模块中提供了两个主要的mock类,分别是Mock和MagicMock.
先看一下官方文档的定义:
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
摘要:非常适合写单元测试用它掉网络请求的返回值即可测试用的给上面的加装饰器放在上面这种一般的使用场景就是加缓存或者计时之类因为异步的里面是个所以最里面包的一层还是要加并且用返回 mock非常适合写单元测试, 用它patch掉网络请求的返回值即可 async_func.py #!/usr/bin/env python # -*- coding:utf-8 -*- import signal i...
摘要:接下来我们将介绍如何对对象的方法进行模拟测试。选项创建模拟测试接口我们可以在的构造函数中提供一个模拟测试实例,而不是模拟创建具体的模拟测试方法。 如何不靠耐心测试 通常,我们编写的软件会直接与那些我们称之为肮脏的服务交互。通俗地说,服务对我们的应用来说是至关重要的,它们之间的交互是我们设计好的,但这会带来我们不希望的副作用——就是那些在我们自己测试的时候不希望的功能。 比如,可能我们...
摘要:准确的说,是中一个用于支持单元测试的库,它的主要功能是使用对象替代掉指定的对象,以达到模拟对象的行为。下面我们使用对象在单元测试中分别测试访问正常和访问不正常的情况。 Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西。准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python...
摘要:一些常用的示例先简单定义个类,方便举例这个类里有两个成员方法,一个有参数,一个无参数。有个模块方法,返回数据库中所有指定的人员,并按排序掉整个数据库访问先得到一个的对象,再在中设置一个对象,此时不需要自己再创建 一些常用的mock示例 先简单定义个类,方便举例: class Person: def __init__(self): self.__age = 10 ...
阅读 755·2021-11-09 09:47
阅读 1530·2019-08-30 15:44
阅读 1124·2019-08-26 13:46
阅读 2087·2019-08-26 13:41
阅读 1242·2019-08-26 13:32
阅读 3728·2019-08-26 10:35
阅读 3498·2019-08-23 17:16
阅读 418·2019-08-23 17:07