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

如何修复测试中使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:04:56