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

如何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:22:18