using Moq; using PersonalToolBox.Models; using PersonalToolBox.Services; namespace PersonalToolBox.Tests.Services; public class ProcessExecutionServiceTests { private readonly Mock _logServiceMock = new(); [Fact] public void Execute_NullTool_LogsError() { var service = new ProcessExecutionService(_logServiceMock.Object); service.Execute(null!); _logServiceMock.Verify(x => x.Error(It.Is(s => s.Contains("空工具项"))), Times.Once); } [Fact] public void Execute_InvalidTool_LogsWarning() { var tool = new ToolItem { Name = "BadTool", ExecutablePath = @"C:\nonexistent.exe", IsValid = false }; var service = new ProcessExecutionService(_logServiceMock.Object); service.Execute(tool); _logServiceMock.Verify(x => x.Warning(It.Is(s => s.Contains("无法运行") && s.Contains("BadTool"))), Times.Once); } [Fact] public void Execute_ProcessFails_LogsError() { var tool = new ToolItem { Name = "FailTool", ExecutablePath = @"Z:\impossible_path\not_really.exe", IsValid = true }; var service = new ProcessExecutionService(_logServiceMock.Object); service.Execute(tool); // Opening a non-existent file should throw and be caught _logServiceMock.Verify(x => x.Error(It.Is(s => s.Contains("FailTool") && s.Contains("失败"))), Times.Once); } [Fact] public void Execute_Success_LogsInfo() { // Use a command that definitely exists on Windows var tool = new ToolItem { Name = "记事本", ExecutablePath = "notepad.exe", IsValid = true }; var service = new ProcessExecutionService(_logServiceMock.Object); service.Execute(tool); _logServiceMock.Verify(x => x.Info(It.Is(s => s.Contains("成功启动") && s.Contains("记事本"))), Times.Once); } }