語法: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賦值了。最后就可以進行斷言,運行測試了;
參考: /tupian/20230522/login.html
分享標題:封裝mock-創新互聯
當前鏈接:http://vcdvsql.cn/article18/cedjgp.html
成都網站建設公司_創新互聯,為您提供網站設計、關鍵詞優化、ChatGPT、Google、自適應網站、網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯