使用 Python 来写 mock 代码 - 其实很简单

本贴最后更新于 1566 天前,其中的信息可能已经物是人非

一、使用Python来写mock代码??

image.png

1.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.不同的参数返回不同的值

image.png

创建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方法从未调用过



二、总结??

image.png

image.png

回帖
请输入回帖内容 ...