import unittest from unittest.mock import patch, MagicMock import sys import os # 添加项目根目录到Python路径 sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) from hardware.inverter import InverterController from pymodbus.exceptions import ModbusException class TestInverterController(unittest.TestCase): def setUp(self): """测试前的准备工作""" # 创建模拟的继电器控制器 self.mock_relay = MagicMock() self.mock_relay.modbus_client = MagicMock() # 创建变频器控制器实例 self.inverter = InverterController(relay_controller=self.mock_relay) def test_inverter_initialization(self): """测试变频器控制器初始化""" self.assertEqual(self.inverter.relay_controller, self.mock_relay) self.assertEqual(self.inverter.max_frequency, 400.0) # 检查配置 self.assertIn('slave_id', self.inverter.config) self.assertIn('frequency_register', self.inverter.config) self.assertIn('start_register', self.inverter.config) self.assertIn('stop_register', self.inverter.config) self.assertIn('start_command', self.inverter.config) self.assertIn('stop_command', self.inverter.config) def test_set_frequency_success(self): """测试设置频率成功""" # 配置模拟对象 self.mock_relay.modbus_client.connect.return_value = True mock_result = MagicMock() self.mock_relay.modbus_client.write_register.return_value = mock_result # 设置频率 result = self.inverter.set_frequency(200.0) # 验证调用 self.mock_relay.modbus_client.connect.assert_called_once() self.mock_relay.modbus_client.write_register.assert_called_once() self.assertTrue(result) def test_set_frequency_connection_failed(self): """测试设置频率时连接失败""" # 配置模拟对象 self.mock_relay.modbus_client.connect.return_value = False # 设置频率 result = self.inverter.set_frequency(200.0) # 验证结果 self.assertFalse(result) self.mock_relay.modbus_client.connect.assert_called_once() self.mock_relay.modbus_client.write_register.assert_not_called() def test_set_frequency_modbus_exception(self): """测试设置频率时Modbus异常""" # 配置模拟对象 self.mock_relay.modbus_client.connect.return_value = True self.mock_relay.modbus_client.write_register.side_effect = ModbusException("Modbus错误") # 设置频率 result = self.inverter.set_frequency(200.0) # 验证结果 self.assertFalse(result) def test_set_frequency_value_clamping(self): """测试频率值限制""" # 配置模拟对象 self.mock_relay.modbus_client.connect.return_value = True mock_result = MagicMock() self.mock_relay.modbus_client.write_register.return_value = mock_result # 测试超过最大值的频率 result = self.inverter.set_frequency(500.0) # 超过400.0最大值 # 验证调用 self.assertTrue(result) self.mock_relay.modbus_client.write_register.assert_called_once() def test_control_start_success(self): """测试启动变频器成功""" # 配置模拟对象 self.mock_relay.modbus_client.connect.return_value = True mock_result = MagicMock() self.mock_relay.modbus_client.write_register.return_value = mock_result # 启动变频器 result = self.inverter.control('start') # 验证调用 self.assertTrue(result) self.mock_relay.modbus_client.connect.assert_called_once() self.mock_relay.modbus_client.write_register.assert_called_once() def test_control_stop_success(self): """测试停止变频器成功""" # 配置模拟对象 self.mock_relay.modbus_client.connect.return_value = True mock_result = MagicMock() self.mock_relay.modbus_client.write_register.return_value = mock_result # 停止变频器 result = self.inverter.control('stop') # 验证调用 self.assertTrue(result) self.mock_relay.modbus_client.connect.assert_called_once() self.mock_relay.modbus_client.write_register.assert_called_once() def test_control_invalid_action(self): """测试无效的控制动作""" # 配置模拟对象 self.mock_relay.modbus_client.connect.return_value = True # 使用无效动作 result = self.inverter.control('invalid_action') # 验证结果 self.assertFalse(result) self.mock_relay.modbus_client.connect.assert_not_called() self.mock_relay.modbus_client.write_register.assert_not_called() def test_control_connection_failed(self): """测试控制时连接失败""" # 配置模拟对象 self.mock_relay.modbus_client.connect.return_value = False # 启动变频器 result = self.inverter.control('start') # 验证结果 self.assertFalse(result) self.mock_relay.modbus_client.connect.assert_called_once() self.mock_relay.modbus_client.write_register.assert_not_called() def test_control_modbus_exception(self): """测试控制时Modbus异常""" # 配置模拟对象 self.mock_relay.modbus_client.connect.return_value = True self.mock_relay.modbus_client.write_register.side_effect = ModbusException("Modbus错误") # 启动变频器 result = self.inverter.control('start') # 验证结果 self.assertFalse(result) if __name__ == '__main__': unittest.main()