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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:01:23