using System.Web.Http; using System.Web.Http.Results; using CncModels.Dto; using CncRepository.Impl; using CncRepository.Impl.Dashboard; using CncRepository.Impl.Log; using CncRepository.Interface; using CncService.Impl; using CncService.Interface; using CncWebApi.Controllers; using Xunit; namespace CncWebApi.Tests { /// /// Controller工厂 —— 创建Controller实例用于单元测试 /// 直接实例化Controller,不经过HTTP管线(跳过JwtAuthFilter等过滤器) /// 所有Repository/Service使用cnc_test真实数据库 /// public static class ControllerFactory { private static readonly string _conn = TestDb.ConnectionString; private const string _jwtSecret = "test-jwt-secret-key-for-unit-testing-2024"; #region Repository 创建 private static ISysConfigRepository SysConfigRepo() => new SysConfigRepository(_conn); private static IBrandRepository BrandRepo() => new BrandRepository(_conn); private static IBrandFieldMappingRepository BrandFieldMappingRepo() => new BrandFieldMappingRepository(_conn); private static ICollectAddressRepository CollectAddressRepo() => new CollectAddressRepository(_conn); private static IMachineRepository MachineRepo() => new MachineRepository(_conn); private static IWorkerRepository WorkerRepo() => new WorkerRepository(_conn); private static IWorkerMachineRepository WorkerMachineRepo() => new WorkerMachineRepository(_conn); private static IWorkshopRepository WorkshopRepo() => new WorkshopRepository(_conn); private static IAlertRepository AlertRepo() => new AlertRepository(_conn); private static IDailyProductionRepository DailyProductionRepo() => new DailyProductionRepository(_conn); private static IProductionSegmentRepository ProductionSegmentRepo() => new ProductionSegmentRepository(_conn); private static IProductionAdjustmentRepository ProductionAdjustmentRepo() => new ProductionAdjustmentRepository(_conn); private static IScreenConfigRepository ScreenConfigRepo() => new ScreenConfigRepository(_conn); private static IScreenFilterRepository ScreenFilterRepo() => new ScreenFilterRepository(_conn); private static IDashboardRepository DashboardRepo() => new DashboardRepository(_conn); private static ICollectorHeartbeatRepository HeartbeatRepo() => new CollectorHeartbeatRepository(_conn); private static ISystemLogRepository SystemLogRepo() => new SystemLogRepository(_conn); private static ICollectRawRepository CollectRawRepo() => new CncRepository.Impl.Log.CollectRawRepository(_conn); #endregion #region Service 创建 private static IAuthService CreateAuthService() => new AuthService(SysConfigRepo(), _jwtSecret); private static IDashboardService CreateDashboardService() => new DashboardService(DashboardRepo(), HeartbeatRepo(), SysConfigRepo()); private static IMachineService CreateMachineService() => new MachineService(MachineRepo(), CollectAddressRepo(), WorkerMachineRepo(), BrandRepo()); private static IBrandService CreateBrandService() => new BrandService(BrandRepo(), BrandFieldMappingRepo(), CollectAddressRepo()); private static ICollectAddressService CreateCollectAddressService() => new CollectAddressService(CollectAddressRepo(), MachineRepo(), BrandRepo(), WorkshopRepo(), CollectRawRepo(), SysConfigRepo()); private static IWorkerService CreateWorkerService() => new WorkerService(WorkerRepo(), WorkerMachineRepo(), MachineRepo(), SysConfigRepo()); private static IProductionService CreateProductionService() => new ProductionService(DailyProductionRepo(), ProductionSegmentRepo(), ProductionAdjustmentRepo()); private static IAlertService CreateAlertService() => new AlertService(AlertRepo()); private static IWorkshopService CreateWorkshopService() => new WorkshopService(WorkshopRepo()); private static IScreenService CreateScreenService() => new ScreenService(ScreenConfigRepo(), ScreenFilterRepo(), WorkshopRepo()); private static ISystemLogService CreateSystemLogService() => new SystemLogService(SystemLogRepo()); #endregion #region Controller 创建 /// 创建AuthController(无JWT过滤) public static AuthController CreateAuthController() => new AuthController(CreateAuthService()); /// 创建HealthController(无依赖) public static HealthController CreateHealthController() => new HealthController(); /// 创建BrandController public static BrandController CreateBrandController() => new BrandController(CreateBrandService()); /// 创建MachineController public static MachineController CreateMachineController() => new MachineController(CreateMachineService()); /// 创建CollectAddressController public static CollectAddressController CreateCollectAddressController() => new CollectAddressController(CreateCollectAddressService()); /// 创建WorkerController public static WorkerController CreateWorkerController() => new WorkerController(CreateWorkerService()); /// 创建DashboardController public static DashboardController CreateDashboardController() => new DashboardController(CreateDashboardService()); /// 创建SettingsController(系统配置+车间管理) public static SettingsController CreateSettingsController() => new SettingsController(SysConfigRepo(), CreateWorkshopService()); /// 创建ProductionController public static ProductionController CreateProductionController() => new ProductionController(CreateProductionService()); /// 创建AlertController public static AlertController CreateAlertController() => new AlertController(CreateAlertService()); /// 创建LogController public static LogController CreateLogController() => new LogController(CreateSystemLogService(), ProductionAdjustmentRepo()); /// 创建ScreenConfigController public static ScreenConfigController CreateScreenConfigController() => new ScreenConfigController(CreateScreenService()); /// 创建ScreenController(大屏,无JWT过滤) public static ScreenController CreateScreenController() => new ScreenController(CreateDashboardService(), CreateScreenService(), SysConfigRepo()); /// 创建OptionController public static OptionController CreateOptionController() => new OptionController( CreateWorkshopService(), CreateBrandService(), CreateMachineService(), CreateWorkerService(), CreateCollectAddressService()); #endregion #region 测试辅助方法 /// /// 从IHttpActionResult中提取ApiResponse<T>内容 /// Controller返回Ok(ApiResponse<T>.Success(data)),实际类型是OkNegotiatedContentResult<ApiResponse<T>> /// public static ApiResponse Extract(IHttpActionResult result) { var okResult = result as OkNegotiatedContentResult>; Assert.NotNull(okResult); return okResult.Content; } /// /// 验证ApiResponse成功:Code=0, Message="success" /// public static void AssertSuccess(ApiResponse response) { Assert.Equal(0, response.Code); Assert.Equal("success", response.Message); } #endregion } }