语法:unittest.mock.patch(target,new = DEFAULT,spec = None,create = False,spec_set = None,autospec = None,new_callable = None,** kwarg )
;html
参数target 为'package.module.classname'格式的字符串,若是参数new被省略,那么target 被MagicMock代替;函数
若是patch()用做装饰器而且省略new,则建立的mock将做为额外参数传递给装饰函数,若是patch()用做上下文管理器,则上下文管理器返回建立的mock;测试
New_Callable参数容许指定将被调用以建立新对象的其余类或可调用对象,默认状况下,使用magicMock。code
修改Test.py文件中的TestData类,在测试用例前加上一个@mock.patch()装饰器orm
from unittest import mock from unittest import TestCase import unittest import function1 class TestData(TestCase): # patch装饰器 @mock.patch('function1.data_parse') def test_print1(self, mock_data_parse): mock_data_parse.return_value = {"result": "success", "reason":"null"} statues = function1.data_show() print(statues) self.assertEqual(statues, "data parse success") @mock.patch('function1.data_parse') def test_print2(self, data_parse): data_parse.return_value = {"result": "fail", "reason": "Data Error"} statues = function1.data_show() self.assertEqual(statues, "data parse failed") if __name__ == "__main__": unittest.main()
咱们这里模拟的是函数中的数据,若是须要mock的数据是一个类中方法的数据,写法也是同样的,好比function1.py模块中的代码是:htm
class DataParse: def data_parse(self): pass class DataShow: def data_show(self): ret = DataParse().data_parse() try: if ret.get('result') == "success": return "data parse success" elif ret.get('result') == "fail": print("data parse failed: {}".format(ret.get('reason'))) return "data parse failed" else: return "Unknow Reason" except: return "Server Unknow Reason"
那Test.py文件中的代码能够这样写:对象
from unittest import mock from unittest import TestCase import unittest from function1 import DataParse, DataShow class TestData(TestCase): # patch装饰器 @mock.patch('function1.DataParse') def test_print1(self, mock_DataParse): # 先拿到类的mock实例 dataParse = mock_DataParse.return_value # 在经过类的mock实例调用方法,对方法返回值进行mock dataParse.data_parse.return_value = {"result": "success", "reason":"null"} # 调用data_show statues = DataShow().data_show() print(statues) self.assertEqual(statues, "data parse success") @mock.patch('function1.DataParse') def test_print2(self, mock_DataParse): # 先拿到类的mock实例 dataParse = mock_DataParse.return_value # 在经过类的mock实例调用方法,对方法返回值进行mock dataParse.data_parse.return_value = {"result": "fail", "reason": "Data Error"} # 调用data_show statues = DataShow().data_show() print(statues) self.assertEqual(statues, "data parse failed") if __name__ == "__main__": unittest.main() =========输出============= data parse success data parse failed: Data Error data parse failed
首先使用@mock.patch()
装饰器来装饰你要使用的测试用例,@mock.patch()中须要带一个参数,指定须要mock的函数或者类,和这个类所在的包和模块,例如:@mock.patch(''function1.data_parse'')
,表示给一个在function1模块中的data_parse函数mock数据;字符串
而后在测试用例中接受一个参数,这个参数是mock哪一个函数,就在函数名前加一个mock,例如给data_parse函数mock数据,这个参数名就是mock_data_parse
;get
有了这个参数以后就能够给mock的函数的return_value赋值了。最后就能够进行断言,运行测试了;it