我将在单元测试中模拟一个Python函数.

这是主要功能.

from api import get_users_from_api

def get_users(user_ids):
    for user_id in user_ids:
        res = get_users_from_api(user_id)

我试图在单元测试中模拟get_users_from_api函数,因为它正在调用第三方api端点.

这是测试脚本.

@patch("api.get_users_from_api")
def test_get_users(self, mock_get_users)
    user_ids = [1, 2, 3]
    mock_get_users.return_value = {
        id: 1,
        first_name: "John",
        last_name: "Doe",
        ...
    } # mock response
    get_users(user_ids) # call main function

问题是,我对所有用户都得到了相同的结果,因为我只使用了一个mock作为返回值get_users_from_api.

我想 for each 用户模拟不同的值.我怎么能这样做呢?

推荐答案

您可以在unitest.mock中使用side_effect.

这就是密码.

def get_dynamic_users_mock(user_id):
    mock_by_user_id = {
        1: {
            "id": 1,
            "first_name": "John",
            "last_name": "Doe",
            ...
        },
        2: {
            "id": 2,
            "first_name": "Jane",
            "last_name": "Smith",
            ...
        },
        ...
    }
    return mock_by_user_id[user_id]

@patch("api.get_users_from_api")
def test_get_users(self, mock_get_users)
    user_ids = [1, 2, 3]
    mock_get_users.side_effect = get_dynamic_users_mock
    get_users(user_ids) # call main function

Python相关问答推荐

我在使用fill_between()将最大和最小带应用到我的图表中时遇到问题

比较两个数据帧并并排附加结果(获取性能警告)

如何将ctyles.POINTER(ctyles.c_float)转换为int?

如何比较numPy数组中的两个图像以获取它们不同的像素

将jit与numpy linSpace函数一起使用时出错

根据二元组列表在pandas中创建新列

Stacked bar chart from billrame

移动条情节旁边的半小提琴情节在海运

合并帧,但不按合并键排序

在Python中使用if else或使用regex将二进制数据如111转换为001""

Matplotlib中的字体权重

下三角形掩码与seaborn clustermap bug

如何在Great Table中处理inf和nans

在用于Python的Bokeh包中设置按钮的样式

如何获得3D点的平移和旋转,给定的点已经旋转?

当输入是字典时,`pandas. concat`如何工作?

如何在SQLAlchemy + Alembic中定义一个"Index()",在基表中的列上

遍历列表列表,然后创建数据帧

使用Scikit的ValueError-了解

大Pandas 中的群体交叉融合