如何测试模板模式下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
相关产品推荐
相关产品推荐

