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

