一、使用Python來寫mock代碼🔨🔨
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="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="支付成功")
# 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處理Mock的常用操作
- 對於使用Python寫mock代碼有幫助
- 本文為可優原創, 如需轉載請聯系本人。有不足之處, 歡迎指點!