语法:unittest.mock.patch(target,new = DEFAULT,spec = None,create = False,spec_set = None,autospec = None,new_callable = None,** kwarg )
;
参数target 为’package.module.classname’格式的字符串,如果参数new被省略,那么target 被MagicMock代替;
如果patch()用作装饰器并且省略new,则创建的mock将作为额外参数传递给装饰函数,如果patch()用作上下文管理器,则上下文管理器返回创建的mock;
New_Callable参数允许指定将被调用以创建新对象的其他类或可调用对象,默认情况下,使用magicMock。
修改Test.py文件中的TestData类,在测试用例前加上一个 @mock .patch()装饰器
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模块中的代码是:
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
;
有了这个参数之后就可以给mock的函数的return_value赋值了。最后就可以进行断言,运行测试了;
参考: https://www.9xkd.com/user/plan-view.html?id=1585826642
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:http://blog.itpub.net/69908432/viewspace-2647837/