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

pytest中使用@patch装饰器替换mymodule.constants.MYCONSTANT常量失败如何解决

错误原因梳理

  • 第一种写法报错fixture mock_constant not found的核心逻辑:patch的第二个位置参数对应new配置项,当你传入3作为new的取值时,patch会直接将目标常量替换为固定值3,不会生成mock对象注入到测试函数中,你额外定义的mock_constant形参会被pytest判定为待注入的fixture,自然找不到对应fixture触发报错。
  • 第二种加return_value=3不生效的原因:return_value仅作用于可调用的模拟对象(函数、方法、类实例化逻辑),你要替换的是固定值常量,业务代码中是直接引用常量的值而非调用它,不会触发return_value的返回逻辑,因此替换不会生效。

正确写法

直接使用new参数指定要替换的常量值,同时删除测试函数多余的mock_constant形参即可:

import pytest
from unittest.mock import patch

@patch('mymodule.constants.MYCONSTANT', new=3)
def test_constant(self):
    MyObject()

如果后续你需要获取这个常量的访问情况(比如断言是否被调用、被访问次数),可以用不带new参数的写法,直接给注入的mock对象设置魔术方法适配常量取值场景:

@patch('mymodule.constants.MYCONSTANT')
def test_constant(self, mock_constant):
    # 让mock对象在被当作值对比/运算时表现为3
    mock_constant.__int__ = lambda self: 3
    mock_constant.__eq__ = lambda self, other: other == 3
    MyObject()
    # 可选:断言常量被访问过
    assert mock_constant.__int__.called

常规替换常量场景下优先使用第一种写法,逻辑更简洁性能更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:18:03