Files
Feeding_control_system/tests/relay_controller_pytest.py
2026-02-10 10:18:17 +08:00

111 lines
4.4 KiB
Python

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.relay import RelayController
class TestRelayController(unittest.TestCase):
def setUp(self):
"""测试前的准备工作"""
self.relay_host = '192.168.250.62'
self.relay_port = 50000
self.relay = RelayController(host=self.relay_host, port=self.relay_port)
def test_relay_initialization(self):
"""测试继电器控制器初始化"""
self.assertEqual(self.relay.host, self.relay_host)
self.assertEqual(self.relay.port, self.relay_port)
self.assertIsNotNone(self.relay.modbus_client)
# 检查设备映射
self.assertIn(RelayController.UPPER_TO_JBL, self.relay.device_bit_map)
self.assertIn(RelayController.UPPER_TO_ZD, self.relay.device_bit_map)
self.assertIn(RelayController.DOOR_LOWER_1, self.relay.device_bit_map)
self.assertIn(RelayController.DOOR_LOWER_2, self.relay.device_bit_map)
self.assertIn(RelayController.BREAK_ARCH_UPPER, self.relay.device_bit_map)
self.assertIn(RelayController.BREAK_ARCH_LOWER, self.relay.device_bit_map)
@patch('hardware.relay.socket.socket')
def test_send_command_success(self, mock_socket_class):
"""测试发送命令成功"""
# 配置模拟对象
mock_socket_instance = MagicMock()
mock_socket_class.return_value.__enter__.return_value = mock_socket_instance
mock_socket_instance.recv.return_value = b'\x00\x00\x00\x00\x00\x06\x01\x01\x00\x00'
# 发送命令
response = self.relay.send_command(self.relay.read_status_command)
# 验证调用
mock_socket_instance.connect.assert_called_once_with((self.relay_host, self.relay_port))
mock_socket_instance.send.assert_called_once()
self.assertIsNotNone(response)
@patch('hardware.relay.socket.socket')
def test_send_command_exception(self, mock_socket_class):
"""测试发送命令异常处理"""
# 配置模拟对象以引发异常
mock_socket_class.return_value.__enter__.side_effect = Exception("网络错误")
# 发送命令
response = self.relay.send_command(self.relay.read_status_command)
# 验证结果
self.assertIsNone(response)
def test_control_valid_device_action(self):
"""测试控制有效设备和动作"""
with patch.object(self.relay, 'send_command') as mock_send:
# 测试打开上料斗门
self.relay.control(RelayController.UPPER_TO_JBL, 'open')
mock_send.assert_called_once()
def test_control_invalid_device(self):
"""测试控制无效设备"""
with patch.object(self.relay, 'send_command') as mock_send:
# 测试无效设备
self.relay.control('invalid_device', 'open')
mock_send.assert_not_called()
def test_control_invalid_action(self):
"""测试控制无效动作"""
with patch.object(self.relay, 'send_command') as mock_send:
# 测试无效动作
self.relay.control(RelayController.UPPER_TO_JBL, 'invalid_action')
mock_send.assert_not_called()
@patch.object(RelayController, 'send_command')
def test_get_status_success(self, mock_send_command):
"""测试获取状态成功"""
# 模拟返回的有效响应
mock_send_command.return_value = b'\x00\x00\x00\x00\x00\x06\x01\x01\x00\x1F'
status = self.relay.get_status()
# 验证返回的状态字典
self.assertIsInstance(status, dict)
self.assertIn(RelayController.UPPER_TO_JBL, status)
self.assertIn(RelayController.UPPER_TO_ZD, status)
mock_send_command.assert_called_once_with(self.relay.read_status_command)
@patch.object(RelayController, 'send_command')
def test_get_status_failure(self, mock_send_command):
"""测试获取状态失败"""
# 模拟返回的无效响应
mock_send_command.return_value = None
status = self.relay.get_status()
# 验证返回空状态
self.assertIsInstance(status, dict)
self.assertEqual(len(status), 0)
if __name__ == '__main__':
unittest.main()