如何修复测试中使用patch拦截Processor类session.stop方法的报错?
问题修复指南
问题场景
我定义了如下Processor类:
class Processor: def __init__(self, session_provider): self.session_provider = session_provider def run(self): ... self.session_provider.get_session().stop()
我希望在测试时阻止run方法结束时关闭session,尝试用unittest.mock.patch临时修改stop方法,但代码报错:
import unittest from unittest.mock import Mock, MagicMock, patch from src.components.processor import Processor class TestProcessor(unittest.TestCase): def test_run(self): ... with('src.components.processor.self.session_provider.get_session.stop', new_callable=Mock()): processor.run()
错误信息:
AttributeError: module 'src.components.processor' has no attribute 'self'
错误原因
你写的patch路径完全错误:self是类实例内部的属性引用,不属于模块层面的属性,patch无法通过模块路径定位到实例的self对象。
修复方案
方案1:直接Mock Session对象(最推荐)
在初始化Processor时,传入Mock的session_provider,让它返回的session对象的stop方法成为空操作:
import unittest from unittest.mock import Mock from src.components.processor import Processor class TestProcessor(unittest.TestCase): def test_run(self): # 创建Mock的session,stop方法啥都不做 mock_session = Mock() # 创建Mock的session_provider,指定get_session返回mock_session mock_session_provider = Mock() mock_session_provider.get_session.return_value = mock_session # 初始化Processor实例 processor = Processor(mock_session_provider) # 执行run方法,此时stop不会触发真实的关闭逻辑 processor.run() # 可选:验证stop是否被调用过 mock_session.stop.assert_called_once()
方案2:Patch实例的stop方法
如果已经有Processor实例,直接patch实例中session的stop方法:
import unittest from unittest.mock import Mock, patch from src.components.processor import Processor class TestProcessor(unittest.TestCase): def test_run(self): # 初始化session_provider和Processor实例 session_provider = Mock() processor = Processor(session_provider) # 先拿到mock的session对象 mock_session = Mock() session_provider.get_session.return_value = mock_session # patch这个session的stop方法 with patch.object(mock_session, 'stop'): processor.run() # 执行时stop被mock,不会关闭session
方案3:Patch类的方法路径(不推荐)
如果一定要通过模块路径patch,可以定位到session_provider.get_session的返回,但不如直接Mock实例直观:
import unittest from unittest.mock import Mock, patch from src.components.processor import Processor class TestProcessor(unittest.TestCase): def test_run(self): mock_session = Mock() # patch Processor实例中session_provider的get_session方法 with patch.object(Processor, 'session_provider', create=True) as mock_sp: mock_sp.get_session.return_value = mock_session processor = Processor(Mock()) processor.run()
内容的提问来源于stack exchange,提问作者KwarcPL
相关产品推荐
相关产品推荐

