You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单元测试中实现函数多次调用时的Mock?

在单元测试中Mock函数实现多次调用返回不同结果

在Python单元测试里,要让Mock函数每次调用返回不同值,最直接的方案是使用unittest.mock(或pytest生态的pytest-mock)提供的side_effect参数——它支持传入一个序列,Mock函数会按调用顺序依次返回序列中的元素。

示例1:Mock无参函数b()

针对你给出的函数a()和b(),测试时可以这样Mock:

from unittest.mock import patch
# 假设你的函数定义在名为my_module的文件中
import my_module

def test_a_multiple_returns():
    with patch('my_module.b') as mock_b:
        # 定义调用顺序对应的返回值:第一次False,第二次True
        mock_b.side_effect = [False, True]
        
        # 执行被测试函数
        my_module.a()
        
        # 验证调用行为
        assert mock_b.call_count == 2  # 确认b被调用了两次
        # 可根据a函数的实际逻辑,添加对应的业务结果断言

示例2:Mock带参函数db.find_one()

对于check_item()函数,需要Mockdb.find_one让它第一次返回用户数据、第二次返回None,测试代码如下:

from unittest.mock import patch
import my_module  # 假设check_item和db对象在这个模块中

def test_check_item_with_mocked_find_one():
    with patch('my_module.db.find_one') as mock_find_one:
        # 按调用顺序设置返回值:第一次返回用户对象,第二次返回None
        mock_find_one.side_effect = [{"user_id": "test_user", "name": "Reza"}, None]
        
        # 执行被测试函数
        result = my_module.check_item("test_user", "item_001")
        
        # 验证业务结果:因为item查询返回None,所以函数应返回False
        assert result is False
        
        # 验证调用参数是否符合预期
        mock_find_one.assert_any_call('user', 'test_user')
        mock_find_one.assert_any_call('item', 'item_001')
        assert mock_find_one.call_count == 2

补充说明

如果需要更复杂的返回逻辑,side_effect还可以传入自定义函数,每次调用Mock时会执行该函数并返回其结果。但对于“固定顺序返回不同值”的场景,直接传入序列是最简洁的方案。

内容的提问来源于stack exchange,提问作者reza mosavian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:40:32