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

Python中如何mock patch已初始化的Config类实例的content方法?

问题根源:Mock 路径错误,无法影响已初始化的实例

你的问题核心在于:config1和config2是在parser模块加载时就已经实例化完成的对象,而你当前patch的是parser.Config这个类——这个操作只会影响测试代码运行后新建的Config实例,对已经存在的config1、config2完全没有作用。

再加上你测试代码里还有个小细节:原validation.py里的函数是validation(),但测试里写的是validation.is_valid(),这也会导致断言失败,需要先修正函数名对应问题。


正确的解决方案:直接Mock已存在的实例方法

既然config1和config2已经在parser模块中存在,你需要直接patch这两个实例的目标方法(比如content或者keys,取决于你的逻辑依赖)。

方案1:Mock实例的content方法(如果keys()基于content返回的JSON)

假设Config.keys()是从content()返回的JSON中提取键,那你可以这样写测试:

from mock import patch
from parser import validation

@patch('parser.config1.content')
@patch('parser.config2.content')
def test_validation(mock_config2_content, mock_config1_content):
    # 设置content方法返回你需要的JSON字典
    mock_config1_content.return_value = {"email": "example@test.com"}
    # 按需设置config2的返回值
    mock_config2_content.return_value = {"test_key": "test_value"}
    
    # 调用原函数(注意函数名是validation,不是is_valid)
    assert validation.validation("email") == True

方案2:直接Mock实例的keys方法(如果逻辑直接依赖keys())

如果你的validation函数直接判断"email" in config1.keys(),那可以跳过content,直接mockkeys()方法:

from mock import patch
from parser import validation

@patch('parser.config1.keys')
def test_validation(mock_config1_keys):
    # 让keys()返回包含"email"的可迭代对象
    mock_config1_keys.return_value = ["email", "other_key"]
    
    assert validation.validation("email") == True

关键知识点回顾
  1. 模块级实例的生命周期:当你from parser import config1时,config1是在parser模块被首次导入时就创建好的,后续patchConfig类无法回溯修改这个已存在的实例。
  2. Mock的路径规则:要mock的对象,必须是被测试代码实际引用的那个路径。这里validation.py引用的是parser.config1和parser.config2,所以你必须patch这两个具体实例的方法,而不是它们的类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:19:11