如何Mock被测类引用的外部定义常量字符串?
如何Mock外部模块定义的字符串常量
当然可以Mock外部定义的字符串值,问题出在你没找对patch的目标路径,核心是要替换被测试模块中实际引用的那个常量副本,而非原模块里的常量本身。
先明确你的代码结构(对应你的场景)
假设你的文件结构是:
a_definitions.py:定义常量
CONST_VAL = 'Some String'
a.py:导入常量并使用
from a_definitions import CONST_VAL class A: def do_thing(self): # 这里用的是a.py命名空间里的CONST_VAL引用 return f"操作结果:{CONST_VAL}"
正确的Mock方式
测试时,你需要patch的是a.py中已经导入的CONST_VAL,而非原模块a_definitions.py里的常量。因为当你执行from ... import ...时,a.py会在自己的命名空间里创建一个指向原常量的本地引用,类A的方法实际调用的是这个本地引用。
示例测试代码(用unittest框架):
import unittest from unittest.mock import patch from a import A class TestA(unittest.TestCase): # 关键:patch的目标是a模块里的CONST_VAL @patch('a.CONST_VAL', 'Mocked测试字符串') def test_do_thing_mocked_const(self): test_obj = A() result = test_obj.do_thing() self.assertEqual(result, "操作结果:Mocked测试字符串") if __name__ == '__main__': unittest.main()
另一种导入场景的处理
如果你的a.py是通过import a_definitions来引用常量的:
import a_definitions class A: def do_thing(self): return f"操作结果:{a_definitions.CONST_VAL}"
那你需要patch的是a模块中导入的a_definitions对象的CONST_VAL属性,测试代码改成:
@patch('a.a_definitions.CONST_VAL', 'Mocked测试字符串')
为什么之前的尝试失败?
你可能错误地patch了a_definitions.CONST_VAL,但这只会修改原模块里的常量值,而a.py在导入时已经创建了独立的引用,不会同步更新,所以被测试的方法依然会用原来的常量值。
内容的提问来源于stack exchange,提问作者Dana
相关产品推荐
相关产品推荐

