使用 Python 中的单元测试补丁进行动态模拟

问题描述 投票:0回答:1

我将在单元测试中模拟 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
函数,因为它正在调用第 3 方 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

问题是我对所有用户都得到相同的结果,因为我只使用一个模拟作为

get_users_from_api
的返回值。

我想为每个用户模拟不同的值。我该怎么做?

python django python-unittest python-unittest.mock django-unittest
1个回答
0
投票

您可以在unittest.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
© www.soinside.com 2019 - 2024. All rights reserved.