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
相关产品推荐
相关产品推荐

