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));
}
}
}