Pytest如何在fixture中对类函数执行patch操作
patch在fixture中不生效的根因
@patch装饰器直接作用于函数时,patch的生效范围仅覆盖被装饰函数的执行周期。当fixture函数执行完成返回mock对象后,@patch会自动执行清理操作还原原函数,因此测试用例执行时patch已经失效,调用的仍是原方法。
正确实现方案
使用patch上下文管理器配合fixture的yield语法,将patch的生效周期与fixture的生命周期绑定:
import pytest from unittest.mock import patch @pytest.fixture(autouse=True, scope="module") def mock_MyClassFromFixture(): # 启动patch替换目标方法 with patch('a.b.MyClass.myFunction') as mock_myfunc: # 返回mock对象给测试用例使用,patch会在fixture整个生命周期内持续生效 yield mock_myfunc # 离开with上下文时自动还原原方法,对应fixture的teardown阶段
测试用例使用方式
def test_mypoc(mock_MyClassFromFixture): # 注意mock返回值的属性为小写加下划线的return_value,不是驼峰写法returnValue mock_MyClassFromFixture.return_value = "dummy" # 此处调用MyClass.myFunction都会返回预先设置的"dummy"值
额外注意事项
- 确认patch路径为代码实际调用时的导入路径,而非原方法的定义路径,否则patch会失效
- 如果需要所有用例共用相同的mock返回值,可以直接在fixture的
yield之前设置mock_myfunc.return_value,无需在每个测试用例中重复配置 - 如果fixture设置了
autouse=True,测试用例不需要主动声明传入fixture也会自动生效
内容的提问来源于stack exchange,提问作者user9297554
相关产品推荐
相关产品推荐

