mock 模块学习
mock是什么
mock英文意思是模拟,主要是功能是使用mock对象来指定python对象,以达到模拟对象的作用
假设你测试的对象是一个函数,但是其中函数中使用了其他对象的函数和功能,但是这个时候要进行函数的单元测试。可能其他对象在当前环境下无法使用,所以就要采用mock来模拟对象
常见用法
-
mock.MagicMock
顾名思义这是一个魔法模拟,可以像魔术一样变成任何的对象或者函数,你可以指定它里面的一些方法,在达到对对象构造的目的
return_value: 此参数的作用是构造函数的返回值,一般是为函数设置返回值
-
可以对对象的函数例如
obj.func() = MagicMock(return_value=3)
表示obj对象的func函数 模拟的返回值是3
-
patch() 和patch.object()
这两个通作为装饰器来使用。因为有时候对于对象的模拟不需要全局变量,只需要一定的作用域即可。
# demo1 @mock.patch.object(driver_client, 'create_client') @mock.patch.object(SpaceType, 'get_by_uuid') @mock.patch.object(requests, 'get') def test_process_test(self, mock_requests_get, mock_get_by_uuid, mock_create_client): mock_create_client.return_value = self.client mock_get_by_uuid.return_value = self.space_type mock_requests_get.return_value = {'code': 200} self.space_engine.process_test(self.space) self.assertEqual (self.client.list_buckets.call_count, 1) mock_requests_get.assert_called() # demo2 with mock.patch.object(Ojbect, 'method', return_value=None) as mock_method: thing = Object() thing.method(1, 2, 3) # 对结果进行验证 mock_method.assert_called_once_with(1, 2, 3)
Note: 装饰顺序 从里到外进行装饰,就是从下往上装饰 执行顺序 装饰器的调用则是从上往下执行
同时其他的验证方法可以查看官方文档来进行学习操作
mock官方文档