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

如何测试模板模式下Python抽象基类的__call__方法?

测试模板模式基类的合理性与可行方案

一、测试基类的合理性

完全合理。模板模式的核心是基类定义固定执行流程,子类仅实现可变的抽象步骤。测试基类的__call__方法,能确保核心流程逻辑(比如步骤顺序、流程控制)的正确性,无需在每个子类测试中重复验证流程,只需要单独测试子类各自的special_process_1实现逻辑即可,既减少冗余测试代码,也能避免后续流程修改时漏测。

二、可行的测试方案

方案1:创建测试专用子类(推荐)

直接定义一个仅用于测试的子类,实现抽象方法,再通过替换该方法为Mock来验证基类流程。这种方式完全符合类型检查要求,mypy不会报错:

from unittest.mock import Mock
from your_module import TemplateClass

# 定义测试子类,实现抽象方法
class TestTemplateSubclass(TemplateClass):
    def special_process_1(self):
        # 空实现,后续会被Mock替换
        pass

def test_template_call_logic():
    test_instance = TestTemplateSubclass()
    # 将子类的方法替换为Mock,用于验证调用
    test_instance.special_process_1 = Mock(return_value="mock_result")
    
    # 调用基类的__call__方法
    result = test_instance()
    
    # 验证抽象方法是否按预期被调用
    test_instance.special_process_1.assert_called_once()
    # 进一步验证__call__的流程输出是否符合预期
    assert result == "expected_processed_result"

方案2:类型忽略配合Mock(应急方案)

如果不想创建测试子类,可以通过# type: ignore忽略mypy的类型检查,强制将抽象方法替换为Mock:

from unittest.mock import Mock, patch
from your_module import TemplateClass

def test_template_call():
    # 用patch替换抽象方法
    with patch.object(TemplateClass, "special_process_1", return_value="mock_result") as mock_method:
        # 绕过抽象基类的实例化类型检查
        template_instance = TemplateClass()  # type: ignore
        result = template_instance()
        
        mock_method.assert_called_once()
        assert result == "expected_result"

不过这种方式会绕过类型检查,不如方案1严谨,仅适合快速测试场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:45:29