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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:09:05