import sys import os from unittest.mock import patch, MagicMock # 添加项目根目录到Python路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # 导入插件管理器 from core.managers.plugin_manager import PluginManager # 创建测试用例 def test_plugin_error_handling(): # 创建命令管理器模拟 mock_command_manager = MagicMock() mock_command_manager.plugins = {} # 创建插件管理器 pm = PluginManager(mock_command_manager) # 模拟导入错误 def import_side_effect(name, *args, **kwargs): if name == "plugins.bad_plugin": raise Exception("Load error") mock_module = MagicMock() mock_module.__plugin_meta__ = {"name": "Test Plugin"} return mock_module # 打桩 with patch("pkgutil.iter_modules") as mock_iter, \ patch("importlib.import_module", side_effect=import_side_effect), \ patch("os.path.exists", return_value=True), \ patch("core.managers.plugin_manager.logger") as mock_logger: mock_iter.return_value = [(None, "bad_plugin", False)] # 执行加载 pm.load_all_plugins() # 验证 assert "plugins.bad_plugin" not in pm.loaded_plugins print(f"DEBUG: mock_logger.exception.called: {mock_logger.exception.called}") print(f"DEBUG: mock_logger.error.called: {mock_logger.error.called}") print(f"DEBUG: mock_logger method calls: {mock_logger.method_calls}") # 检查是否调用了日志 if mock_logger.exception.called: print("SUCCESS: logger.exception was called") elif mock_logger.error.called: print("SUCCESS: logger.error was called") else: print("ERROR: No logger method was called!") # 运行测试 if __name__ == "__main__": test_plugin_error_handling()