给数据中心添加菜单操作功能

This commit is contained in:
2025-09-03 11:12:42 +08:00
parent 80ffce4fe4
commit fff2c0477c
9 changed files with 357 additions and 598 deletions

View File

@@ -1,173 +0,0 @@
using DMS.Application.DTOs;
using DMS.Application.DTOs.Events;
using DMS.Application.Interfaces;
using DMS.Application.Services;
using DMS.Core.Interfaces;
using Moq;
using System;
using System.Collections.Concurrent;
using Xunit;
namespace DMS.Infrastructure.UnitTests
{
public class DataCenterServiceTests
{
[Fact]
public void DataCenterService_Should_Implement_All_Required_Methods()
{
// Arrange
var mockRepositoryManager = new Mock<IRepositoryManager>();
var mockDeviceAppService = new Mock<IDeviceAppService>();
var mockVariableTableAppService = new Mock<IVariableTableAppService>();
var mockVariableAppService = new Mock<IVariableAppService>();
// Act
var dataCenterService = new DataCenterService(
mockRepositoryManager.Object,
null, // 在测试中不会使用到mapper
mockDeviceAppService.Object,
mockVariableTableAppService.Object,
mockVariableAppService.Object);
// Assert - Verify that service implements the interface
Assert.IsAssignableFrom<IDataCenterService>(dataCenterService);
}
[Fact]
public void DataCenterService_Should_Have_ConcurrentDictionary_Properties()
{
// Arrange
var mockRepositoryManager = new Mock<IRepositoryManager>();
var mockDeviceAppService = new Mock<IDeviceAppService>();
var mockVariableTableAppService = new Mock<IVariableTableAppService>();
var mockVariableAppService = new Mock<IVariableAppService>();
// Act
var dataCenterService = new DataCenterService(
mockRepositoryManager.Object,
null, // 在测试中不会使用到mapper
mockDeviceAppService.Object,
mockVariableTableAppService.Object,
mockVariableAppService.Object);
// Assert
Assert.NotNull(dataCenterService.Devices);
Assert.NotNull(dataCenterService.VariableTables);
Assert.NotNull(dataCenterService.Variables);
Assert.IsType<ConcurrentDictionary<int, DeviceDto>>(dataCenterService.Devices);
Assert.IsType<ConcurrentDictionary<int, VariableTableDto>>(dataCenterService.VariableTables);
Assert.IsType<ConcurrentDictionary<int, VariableDto>>(dataCenterService.Variables);
}
[Fact]
public void DataCenterService_AddDeviceToMemory_Should_Add_Device_To_Dictionary()
{
// Arrange
var mockRepositoryManager = new Mock<IRepositoryManager>();
var mockMapper = new Mock<IMapper>();
var mockDeviceAppService = new Mock<IDeviceAppService>();
var mockVariableTableAppService = new Mock<IVariableTableAppService>();
var mockVariableAppService = new Mock<IVariableAppService>();
var dataCenterService = new DataCenterService(
mockRepositoryManager.Object,
mockMapper.Object,
mockDeviceAppService.Object,
mockVariableTableAppService.Object,
mockVariableAppService.Object);
var deviceDto = new DeviceDto { Id = 1, Name = "Test Device" };
// Act
dataCenterService.AddDeviceToMemory(deviceDto);
// Assert
Assert.True(dataCenterService.Devices.ContainsKey(1));
Assert.Equal(deviceDto, dataCenterService.Devices[1]);
}
[Fact]
public void DataCenterService_UpdateDeviceInMemory_Should_Update_Device_In_Dictionary()
{
// Arrange
var mockRepositoryManager = new Mock<IRepositoryManager>();
var mockMapper = new Mock<IMapper>();
var mockDeviceAppService = new Mock<IDeviceAppService>();
var mockVariableTableAppService = new Mock<IVariableTableAppService>();
var mockVariableAppService = new Mock<IVariableAppService>();
var dataCenterService = new DataCenterService(
mockRepositoryManager.Object,
mockMapper.Object,
mockDeviceAppService.Object,
mockVariableTableAppService.Object,
mockVariableAppService.Object);
var deviceDto = new DeviceDto { Id = 1, Name = "Test Device" };
var updatedDeviceDto = new DeviceDto { Id = 1, Name = "Updated Device" };
// Act
dataCenterService.AddDeviceToMemory(deviceDto);
dataCenterService.UpdateDeviceInMemory(updatedDeviceDto);
// Assert
Assert.True(dataCenterService.Devices.ContainsKey(1));
Assert.Equal(updatedDeviceDto, dataCenterService.Devices[1]);
Assert.Equal("Updated Device", dataCenterService.Devices[1].Name);
}
[Fact]
public void DataCenterService_RemoveDeviceFromMemory_Should_Remove_Device_From_Dictionary()
{
// Arrange
var mockRepositoryManager = new Mock<IRepositoryManager>();
var mockMapper = new Mock<IMapper>();
var mockDeviceAppService = new Mock<IDeviceAppService>();
var mockVariableTableAppService = new Mock<IVariableTableAppService>();
var mockVariableAppService = new Mock<IVariableAppService>();
var dataCenterService = new DataCenterService(
mockRepositoryManager.Object,
mockMapper.Object,
mockDeviceAppService.Object,
mockVariableTableAppService.Object,
mockVariableAppService.Object);
var deviceDto = new DeviceDto { Id = 1, Name = "Test Device" };
// Act
dataCenterService.AddDeviceToMemory(deviceDto);
dataCenterService.RemoveDeviceFromMemory(1);
// Assert
Assert.False(dataCenterService.Devices.ContainsKey(1));
}
[Fact]
public void DataCenterService_Should_Raise_DeviceChanged_Event_On_Add()
{
// Arrange
var mockRepositoryManager = new Mock<IRepositoryManager>();
var mockMapper = new Mock<IMapper>();
var mockDeviceAppService = new Mock<IDeviceAppService>();
var mockVariableTableAppService = new Mock<IVariableTableAppService>();
var mockVariableAppService = new Mock<IVariableAppService>();
var dataCenterService = new DataCenterService(
mockRepositoryManager.Object,
mockMapper.Object,
mockDeviceAppService.Object,
mockVariableTableAppService.Object,
mockVariableAppService.Object);
DeviceChangedEventArgs eventArgs = null;
dataCenterService.DeviceChanged += (sender, args) => eventArgs = args;
var deviceDto = new DeviceDto { Id = 1, Name = "Test Device" };
// Act
dataCenterService.AddDeviceToMemory(deviceDto);
// Assert
Assert.NotNull(eventArgs);
Assert.Equal(DataChangeType.Added, eventArgs.ChangeType);
Assert.Equal(deviceDto, eventArgs.Device);
}
}
}

View File

@@ -1,159 +0,0 @@
using DMS.Infrastructure.Interfaces.Services;
using DMS.Infrastructure.Services;
using Opc.Ua;
using System;
using System.Threading.Tasks;
using Xunit;
namespace DMS.Infrastructure.UnitTests.Services
{
public class OpcUaServiceTest
{
[Fact]
public async Task TestOpcUaService_CreateSession_WithValidUrl_ShouldCreateSession()
{
// Arrange
var service = new OpcUaService();
var opcUaServerUrl = "opc.tcp://localhost:4840"; // 示例URL实际测试时需要真实的OPC UA服务器
// Act & Assert
// 注意这个测试需要真实的OPC UA服务器才能通过
// 在实际测试环境中您需要启动一个OPC UA服务器
try
{
await service.CreateSession(opcUaServerUrl);
// 如果没有异常,则认为会话创建成功
Assert.True(true);
}
catch (Exception ex)
{
// 在没有真实服务器的情况下,我们期望出现连接异常
Assert.NotNull(ex);
}
}
[Fact]
public async Task TestOpcUaService_CreateSession_WithNullUrl_ShouldThrowException()
{
// Arrange
var service = new OpcUaService();
string opcUaServerUrl = null;
// Act & Assert
await Assert.ThrowsAsync<ArgumentException>(async () =>
{
await service.CreateSession(opcUaServerUrl);
});
}
[Fact]
public async Task TestOpcUaService_CreateSession_WithEmptyUrl_ShouldThrowException()
{
// Arrange
var service = new OpcUaService();
var opcUaServerUrl = "";
// Act & Assert
await Assert.ThrowsAsync<ArgumentException>(async () =>
{
await service.CreateSession(opcUaServerUrl);
});
}
[Fact]
public void TestOpcUaService_IsConnected_WithoutSession_ShouldReturnFalse()
{
// Arrange
var service = new OpcUaService();
// Act
var isConnected = service.IsConnected();
// Assert
Assert.False(isConnected);
}
[Fact]
public async Task TestOpcUaService_ConnectAsync_WithoutSession_ShouldThrowException()
{
// Arrange
var service = new OpcUaService();
// Act & Assert
await Assert.ThrowsAsync<InvalidOperationException>(async () =>
{
await service.ConnectAsync("opc.tcp://localhost:4840");
});
}
[Fact]
public void TestOpcUaService_Connect_WithoutSession_ShouldThrowException()
{
// Arrange
var service = new OpcUaService();
// Act & Assert
Assert.Throws<InvalidOperationException>(() =>
{
service.Connect();
});
}
[Fact]
public void TestOpcUaService_AddSubscription_WithoutSession_ShouldThrowException()
{
// Arrange
var service = new OpcUaService();
var subscriptionName = "TestSubscription";
// Act & Assert
Assert.Throws<InvalidOperationException>(() =>
{
service.AddSubscription(subscriptionName);
});
}
[Fact]
public void TestOpcUaService_BrowseNodes_WithoutSession_ShouldThrowException()
{
// Arrange
var service = new OpcUaService();
var nodeId = NodeId.Null;
// Act & Assert
Assert.Throws<InvalidOperationException>(() =>
{
service.BrowseNodes(nodeId);
});
}
[Fact]
public void TestOpcUaService_ReadValue_WithoutSession_ShouldThrowException()
{
// Arrange
var service = new OpcUaService();
var nodeId = NodeId.Null;
// Act & Assert
Assert.Throws<InvalidOperationException>(() =>
{
service.ReadValue(nodeId);
});
}
[Fact]
public void TestOpcUaService_WriteValue_WithoutSession_ShouldThrowException()
{
// Arrange
var service = new OpcUaService();
var nodeId = NodeId.Null;
var value = "test";
// Act & Assert
Assert.Throws<InvalidOperationException>(() =>
{
service.WriteValue(nodeId, value);
});
}
}
}