使用Python來寫mock代碼(樁代碼)-其實很簡單


一、使用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代碼有幫助
  • 本文為可優原創, 如需轉載請聯系本人。有不足之處, 歡迎指點!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM