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

pytest中类的被补丁方法未返回Mock值问题排查

问题分析与解决

你的问题主要出在mock的层级设置错误和pytest参数化的语法错误上,我来一步步拆解:

1. 先修正明显的语法错误

你的@pytest.mark.parametrize写法不符合规范,正确格式应该是:

@pytest.mark.parametrize("dummy_value", [{"id": 1234}])

需要把参数名用引号包裹,后面直接跟参数列表,不需要额外的冒号和多余括号嵌套。

2. Mock的核心问题:你设置的是类方法的返回值,而非实例方法的

当你用@mock.patch("mypkg.MyDb")(假设你要mock的是mypkg包下的MyDb类),传入测试函数的mock_db是被mock后的类对象。当你执行db = MyDb()时,这个db其实是mock_db.return_value——也就是类实例对应的mock对象。

你之前写的mock_db.some_func.return_value = dummy_value,是在给类本身的some_func方法设置返回值,但实际调用的是实例的some_func方法,所以完全没生效。

正确的设置方式应该针对实例mock的方法:

mock_db.return_value.some_func.return_value = dummy_value

3. 完整修正后的测试代码

假设你的项目结构是mypkg下有mydb.py定义了MyDb类,测试文件和mypkg同级,完整测试代码应该是这样:

from unittest import mock
import pytest
from mypkg.mydb import MyDb

@pytest.mark.parametrize("dummy_value", [{"id": 1234}])
@mock.patch("mypkg.mydb.MyDb")  # 这里要写类的完整路径
def test_simple(mock_db, dummy_value):
    # 设置实例方法的返回值
    mock_db.return_value.some_func.return_value = dummy_value
    
    # 实例化并调用
    db = MyDb()
    print(db)
    result = db.some_func()
    print(result)
    
    # 验证结果符合预期
    assert result == dummy_value

为什么之前的输出是MagicMock?

因为你没有正确设置实例方法的返回值,调用db.some_func()时,返回的是mock默认生成的MagicMock对象,而不是你期望的dummy_value。

额外注意点

  • 确保mock.patch的路径是你在测试代码中导入MyDb的路径,或者是MyDb类的实际定义路径,路径错误会导致mock完全不生效。
  • 如果你的MyDb类的some_func是实例方法,定义时必须加self参数:
    class MyDb:
        def some_func(self, arg):  # 实例方法必须带self
            ...
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:23:24