如何在单元测试中实现函数多次调用时的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
相关产品推荐
相关产品推荐

