Time will tell.

1、Mock基本用法
-
使用Mock能創建你能訪問(模擬)的屬性和方法,
-
指定類或者函式的回傳值和斷言方式,
創建handle_mock_01.py檔案
# 1. 匯入mock模塊 from unittest import mock class Payment(object): """ 創建支付類 """ pass payment = Payment() # 2. 創建Mock物件, 作為Payment的實體方法 payment.pay = mock.Mock(return_value=https://www.cnblogs.com/flowToken1024532/archive/2020/09/29/"Success") # 3. 當呼叫pay方法時, 會回傳定義Mock物件時指定的return_value值 print(payment.pay())
2、不同的引數回傳不同的值
創建handle_mock_02.py檔案
# 1. 匯入mock模塊 from unittest import mock class Payment(object): """ 創建支付類 """ pass def parameter_return_data(param): """定義引數與回傳值映射函式 """ param_data = { "用戶ID1": "支付成功", "用戶ID2": "支付例外", "用戶ID3": "支付超時", "用戶ID4": KeyError("引數有誤"), # 可以回傳例外 } return param_data[param] payment = Payment() # 2. 創建Mock物件, 作為Payment的實體方法 payment.pay = mock.Mock(side_effect=parameter_return_data) # 3. 當呼叫pay方法時, 會回傳指定的值 print(payment.pay("用戶ID1")) # 回傳結果: 支付成功 print(payment.pay("用戶ID2")) # 回傳結果: 支付例外 print(payment.pay("用戶ID3")) # 回傳結果: 支付超時 print(payment.pay("用戶ID4")) # 回傳結果: '引數有誤'
3、傳參個數
創建handle_mock_03.py檔案
# 1. 匯入mock模塊 from unittest import mock class Payment(object): """ 創建支付類 """ pass def fn(a, b): """假設實際pay函式, 有兩個引數""" pass payment = Payment() # 2. 創建Mock物件, 作為Payment的實體方法 payment.pay = mock.create_autospec(fn, return_value=https://www.cnblogs.com/flowToken1024532/archive/2020/09/29/"支付成功") # 3. 當呼叫pay方法時, 傳引數的個數如果不為兩個, 則會拋出例外 print(payment.pay("用戶ID1", "卡號")) # 回傳結果: 支付成功 print(payment.pay("用戶ID1")) # 回傳結果: TypeError: missing a required argument: 'b'
4、斷言方式
創建handle_mock_04.py檔案
# 1. 匯入mock模塊 from unittest import mock class Payment(object): """ 創建支付類 """ pass def parameter_return_data(param): """定義引數與回傳值映射函式 """ param_data = { "用戶ID1": "支付成功", "用戶ID2": "支付例外", "用戶ID3": "支付超時", "用戶ID4": KeyError("引數有誤"), # 可以回傳例外 } return param_data[param] payment = Payment() # 2. 創建Mock物件, 作為Payment的實體方法 payment.pay = mock.Mock(side_effect=parameter_return_data) # 3. 當呼叫pay方法時, 會回傳指定的值 # 4. 不同的斷言方式 # a. assert_called() mock方法至少呼叫一次 # 如果還未呼叫, 則回傳 AssertionError: Expected 'None' to have been called. # 如果已經呼叫, 則回傳None print(payment.pay("用戶ID1")) # 回傳結果: 支付成功 # print(payment.pay.assert_called()) # 回傳結果: None # b. assert_called_once() mock方法只呼叫一次 # 如果呼叫超過一次則回傳 AssertionError: Expected 'None' to have been called. # 否則回傳None print(payment.pay.assert_called_once()) # 回傳結果: None # c. assert_called_with() 斷言mock方法已經攜帶某個引數呼叫了 # 如果沒有攜帶某個引數呼叫, 那么會斷言失敗 print(payment.pay.assert_called_with("用戶ID1")) # 回傳結果: None # d. assert_called_once_with() 斷言mock方法已經攜帶某個引數呼叫了一次 # 如果沒有攜帶某個引數呼叫一次的話, 那么會斷言失敗 print(payment.pay.assert_called_once_with("用戶ID1")) # 回傳結果: None # e. assert_any_call() 有攜帶引數(有即可)呼叫過 # f. assert_not_called() 斷言mock方法從未呼叫過

絮叨
如果你處于想學Python自動化或正在學習Python自動化中,Python自動化的教程不少了,但不一定是最新的,說不定你學的是別人一年前就學過的內容,干貨分享一波!2020最新的Python教程,獲取方式,加175317069私信Q群管理即可免費獲取,
喜歡的話,歡迎【評論】、【點贊】、【關注】禮貌三連
Time will tell.(時間會證明一切)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/140496.html
標籤:其他
