using Serilog.Events; using Xunit; using YZWater.Core.Models; using YZWater.Core.Services; using YZWater.Core.ViewModels; namespace YZWater.Core.Tests.ViewModels; /// /// "恢复默认设置"必须真的落到运行配置和磁盘上。 /// 现场日志(log-20261001)里操作员 07:36:24 点了恢复默认,日志写着 IP=192.168.2.100:102, /// 但 4 秒后服务初始化仍然是 127.0.0.1:103,随后 5 次"测试连接"全部失败,直到重启程序才好 /// —— 旧实现只往输入框里填了值,配置对象和文件都没动过。 /// 这里刻意先装一个"出厂模板地址",就是为了证明断言能红:漏掉落盘这一步时它必炸。 /// [Collection("Serilog minimum level")] public class ResetToDefaultPersistenceTests : IDisposable { private readonly LogEventLevel _originalLevel = LogService.MinimumLevel; private readonly string _originalIp; private readonly int _originalPort; public ResetToDefaultPersistenceTests() { LogService.ApplyMinimumLevel("Error"); var config = ConfigService.GetConfig()!; _originalIp = config.PlcIp; _originalPort = config.PlcPort; // 现场部署包里的配置就是仿真地址,测试从这里起步 config.PlcIp = "127.0.0.1"; config.PlcPort = 103; } public void Dispose() { var config = ConfigService.GetConfig(); if (config != null) { config.PlcIp = _originalIp; config.PlcPort = _originalPort; } LogService.ApplyMinimumLevel(_originalLevel.ToString()); } [Fact] public void ResetToDefault_UpdatesRuntimeConfigAndPersistedFile() { var vm = new ViewBViewModel(); try { Assert.Equal("127.0.0.1", vm.PlcIp); // 构造时已从配置载入 vm.ResetToDefaultCommand.Execute(null); Assert.Equal(SystemConfig.DefaultPlcIp, vm.PlcIp); Assert.Equal(SystemConfig.DefaultPlcPort, vm.PlcPort); // 光有输入框没用:轮询和"测试连接"读的是配置对象 Assert.Equal(SystemConfig.DefaultPlcIp, ConfigService.GetConfig()!.PlcIp); Assert.Equal(SystemConfig.DefaultPlcPort, ConfigService.GetConfig()!.PlcPort); // 重启后还得留得住:从磁盘重新读一遍 ConfigService.LoadConfig(); Assert.Equal(SystemConfig.DefaultPlcIp, ConfigService.GetConfig()!.PlcIp); Assert.Equal(SystemConfig.DefaultPlcPort, ConfigService.GetConfig()!.PlcPort); } finally { vm.Dispose(); } } }