using DOAN.Model.MES.base_; using DOAN.Model.MES.base_.Dto; using DOAN.Model.MES.product; using DOAN.Model.MES.product.Dto; using DOAN.Service.MES.product; using DOAN.Service.MES.product.IService; using Infrastructure.Pagination; using Moq; using Xunit; namespace DOAN.Tests.MES.Product { /// /// 工单服务端到端测试 /// public class ProWorkorderEndToEndTests { private readonly ProWorkorderService _workorderService; private readonly Mock _mockCoreService; private readonly Mock _mockQueryService; private readonly Mock _mockImportService; private readonly Mock _mockExportService; private readonly Mock _mockUtilityService; private readonly Mock _mockReferenceService; public ProWorkorderEndToEndTests() { // 创建所有子Service的模拟对象 _mockCoreService = new Mock(); _mockQueryService = new Mock(); _mockImportService = new Mock(); _mockExportService = new Mock(); _mockUtilityService = new Mock(); _mockReferenceService = new Mock(); // 初始化主Service _workorderService = new ProWorkorderService( _mockCoreService.Object, _mockQueryService.Object, _mockImportService.Object, _mockExportService.Object, _mockUtilityService.Object, _mockReferenceService.Object ); } /// /// 测试完整的工单创建和查询流程 /// [Fact] public void WorkorderCreationAndQueryFlow_ShouldWorkCorrectly() { // Arrange - 准备添加工单的测试数据 var workorder = new ProWorkorder { Id = "WO123", productionName = "端到端测试产品", productionCode = "E2E001", PlanNum = 50 }; // 模拟添加工单的返回结果 _mockCoreService.Setup(x => x.AddProWorkorder(It.IsAny())) .Returns(workorder); // 模拟获取工单详情的返回结果 _mockQueryService.Setup(x => x.GetInfo(workorder.Id)) .Returns(workorder); // 模拟查询工单列表的返回结果 var queryDto = new ProWorkorderQueryDto { productionCode = "E2E001" }; var expectedListResult = new PagedInfo { Total = 1, Result = new List { new ProWorkorderDto3 { Id = workorder.Id, productionName = workorder.productionName, productionCode = workorder.productionCode, PlanNum = workorder.PlanNum } } }; _mockQueryService.Setup(x => x.GetList(queryDto)) .Returns(expectedListResult); // Act 1 - 添加工单 var addedWorkorder = _workorderService.AddProWorkorder(workorder); // Assert 1 - 验证添加工单的结果 Assert.NotNull(addedWorkorder); Assert.Equal(workorder.Id, addedWorkorder.Id); Assert.Equal(workorder.productionName, addedWorkorder.productionName); _mockCoreService.Verify(x => x.AddProWorkorder(workorder), Times.Once); // Act 2 - 查询工单详情 var retrievedWorkorder = _workorderService.GetInfo(workorder.Id); // Assert 2 - 验证查询工单详情的结果 Assert.NotNull(retrievedWorkorder); Assert.Equal(workorder.Id, retrievedWorkorder.Id); Assert.Equal(workorder.productionName, retrievedWorkorder.productionName); _mockQueryService.Verify(x => x.GetInfo(workorder.Id), Times.Once); // Act 3 - 查询工单列表 var workorderList = _workorderService.GetList(queryDto); // Assert 3 - 验证查询工单列表的结果 Assert.NotNull(workorderList); Assert.Equal(expectedListResult.Total, workorderList.Total); Assert.Single(workorderList.Result); Assert.Equal(workorder.Id, workorderList.Result[0].Id); _mockQueryService.Verify(x => x.GetList(queryDto), Times.Once); } /// /// 测试工单服务的API兼容性 /// [Fact] public void ApiCompatibility_ShouldMaintainSameInterface() { // 验证所有原始方法都能通过新的服务架构访问 // 这确保了上游模块无需修改即可正常工作 // 测试查询方法 var queryDto = new ProWorkorderQueryDto(); _mockQueryService.Setup(x => x.GetList(queryDto)) .Returns(new PagedInfo()); var listResult = _workorderService.GetList(queryDto); Assert.NotNull(listResult); // 测试添加工单方法 var workorder = new ProWorkorder(); _mockCoreService.Setup(x => x.AddProWorkorder(workorder)) .Returns(workorder); var addResult = _workorderService.AddProWorkorder(workorder); Assert.NotNull(addResult); // 测试修改工单方法 _mockCoreService.Setup(x => x.UpdateProWorkorder(workorder)) .Returns(1); var updateResult = _workorderService.UpdateProWorkorder(workorder); Assert.Equal(1, updateResult); // 测试获取引用数据方法 var materialQueryDto = new BaseMaterialListQueryDto5(); _mockReferenceService.Setup(x => x.GetMaterialInfo(materialQueryDto)) .Returns(new List()); var materialResult = _workorderService.GetMaterialInfo(materialQueryDto); Assert.NotNull(materialResult); } /// /// 测试工单服务的异常处理 /// [Fact] public void ExceptionHandling_ShouldBeConsistent() { // 模拟核心服务抛出异常 var workorder = new ProWorkorder(); _mockCoreService.Setup(x => x.AddProWorkorder(workorder)) .Throws(new Exception("模拟添加失败")); // 验证异常能够正确传递 Assert.Throws(() => _workorderService.AddProWorkorder(workorder)); } } }