pytest mock被测类导入的函数无法返回fixture值该如何修复?
问题原因
- fixture定义缺失
def关键字,语法不合法无法正常加载 - 直接将fixture函数作为mock的return_value,实际返回的是函数对象而非fixture返回的字符串值
- 测试函数未声明fixture作为入参,pytest不会自动注入fixture的返回值
- mock装饰器的参数会在测试函数执行前解析,此时fixture还未初始化,不能直接在patch装饰器中引用fixture
修复方案
1. 修正fixture定义
get_sth_test.py补全fixture的函数定义语法:
import pytest @pytest.fixture def get_sth_mock_test(): return 'mocked value'
2. 调整测试用例写法
在测试函数内部给mock对象设置return_value,此时fixture已经完成注入可以直接取值,MyClass_test.py代码调整如下:
from unittest import mock from get_sth_test import get_sth_mock_test from MyClass import MyClass @mock.patch('MyClass.get_sth') def test_MyClass(get_sth_mock, get_sth_mock_test): # 给mock对象设置fixture返回值作为返回结果 get_sth_mock.return_value = get_sth_mock_test instance = MyClass() # 验证示例:确认返回值符合预期 assert instance.sth == 'mocked value'
可选简化方案(使用pytest-mock)
如果安装了pytest-mock插件,可以进一步简化写法,不需要单独写patch装饰器:
from get_sth_test import get_sth_mock_test from MyClass import MyClass def test_MyClass(mocker, get_sth_mock_test): mocker.patch('MyClass.get_sth', return_value=get_sth_mock_test) instance = MyClass() assert instance.sth == 'mocked value'
验证说明
调整后执行测试,MyClass初始化时调用的get_sth会被mock替换,直接返回fixture的mocked value,不会执行原外部函数。
内容的提问来源于stack exchange,提问作者Jarosław Rewers
相关产品推荐
相关产品推荐

