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
关键知识点回顾
- 模块级实例的生命周期:当你
from parser import config1时,config1是在parser模块被首次导入时就创建好的,后续patchConfig类无法回溯修改这个已存在的实例。 - Mock的路径规则:要mock的对象,必须是被测试代码实际引用的那个路径。这里
validation.py引用的是parser.config1和parser.config2,所以你必须patch这两个具体实例的方法,而不是它们的类。
内容的提问来源于stack exchange,提问作者staten12
相关产品推荐
相关产品推荐

