mock的几种用法
1. mock
mock用于在测试中替换掉一些麻烦的外界服务(网络请求、文件操作等),专注于测试测试对象本身。
mock的使用介绍已经有很多,这里只记录Python中mock测试的构造方法,便于以后查阅。
2. 构造方式
2.1. 通过patch构造对象
def setUp(self):
self.request_patcher = mock.patch(REQUEST_MANAGER_PATH)
self.mock_request_manager = self.request_patcher.start()
self.csm = CustomerServiceManager(self.mock_request_manager)
def tearDown(self): // 该部分在以下例子略去
self.request_patcher.stop()
2.2. 通过patch构造方法
self.request_patcher = mock.patch(REQUEST_MANAGER_PATH)
self.mock_request_manager = self.request_patcher.start()
self.mock_request_manager.get.return_value = 'returns'
2.3. 通过Mock构造对象
self.mock_response = mock.Mock()
self.mock_response.content = 'something'
这里不能直接赋值
错误示例:self.mock_response = 'something' 结果就是mock_response从mock对象变成了字符串对象。
2.4. 通过Mock构造方法
self.mock_request = Mock()
self.mock_request.return_value = 'something'
2.5. 通过patch装饰器构造
从之前几例已经不难看出,无论是构造方法还是对象,都是基于一个Mock对象。更何况在Python中方法本来就是对象
@mock.patch(REST_PATH + '.sendTemplateSMS')
def test_send_auth_code(self, mock_send):
pass
mock替换后对象作为参数传入函数。
当存在多个patch装饰器时,需要注意参数顺序。
@mock.patch(func2)
@mock.patch(func1)
def test_funcs(self, mock_func1, mock_func2):
pass
3. 如何抓到mock对象
初写mock测试时,感觉mock的思想很容易理解,mock的用法也挺人性化,主要困扰是我已经想好了mock与测试计划,可是我就是patch不到我想mock的对象。
其实这里主要是要看我要patch的对象什么时候被测试对象用到,然后在被用前抓住mock掉。
模拟一个东西要看它用在何处,而不是来自哪里。