如何用MagicMock+pytest正确测试依赖int转换的Python函数
用MagicMock测试int转换与数值比较的问题解决
首先修正你测试代码里的明显问题:调用func()时得传mock对象进去,原代码没传参数直接调用会报错。
接下来解决int()返回必须是int类型的核心问题——你可以用MagicMock(spec=int)创建一个带int类型特征的mock,这样它既能被int()正常处理,又能自定义比较行为,完全不用指定具体数值:
测试返回True的场景(int(x) > 5)
from unittest.mock import MagicMock import pytest def func(x): if int(x) > 5: return True else: return False def test_func_returns_true_when_int_gt_5(): # 创建模拟int类型的mock,确保int()能接受它 int_like_mock = MagicMock(spec=int) # 定义和5比较时返回大于的结果 int_like_mock.__gt__.return_value = True input_mock = MagicMock() # 让input_mock被int转换时返回这个int类型mock input_mock.__int__.return_value = int_like_mock assert func(input_mock) is True # 验证关键方法是否被正确调用(可选但推荐) input_mock.__int__.assert_called_once() int_like_mock.__gt__.assert_called_once_with(5)
测试返回False的场景(int(x) ≤ 5)
def test_func_returns_false_when_int_le_5(): int_like_mock = MagicMock(spec=int) # 定义和5比较时返回不大于的结果 int_like_mock.__gt__.return_value = False input_mock = MagicMock() input_mock.__int__.return_value = int_like_mock assert func(input_mock) is False input_mock.__int__.assert_called_once() int_like_mock.__gt__.assert_called_once_with(5)
关键原理
MagicMock(spec=int)生成的mock是int的实例(用isinstance可验证),所以int(input_mock)返回的对象完全符合int类型要求,不会触发类型错误。- 我们不需要硬编码6、7这类具体数值,只需要控制
__gt__方法的返回值,就能精准覆盖函数里的两个分支逻辑。 - 最后加的断言可以验证mock的方法是否被正确调用,确保测试真的走到了函数里的关键判断步骤。
内容的提问来源于stack exchange,提问作者Warm
相关产品推荐
相关产品推荐

