ReportService 添加 ExportToFile, 集成测试验证报告文件输出, 116测试5秒完成
This commit is contained in:
parent
4db30131e9
commit
5b168f202e
@ -11,5 +11,7 @@ namespace CounterDrone.Core.Services
|
||||
SimulationReport GetReport(string id);
|
||||
void DeleteReport(string id);
|
||||
PagedResult<SimulationReport> SearchReports(string keyword, string? dateFrom, string? dateTo, int page, int pageSize);
|
||||
/// <summary>导出报告为 Markdown 文件,返回文件路径</summary>
|
||||
string ExportToFile(string reportId, string outputDir);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using CounterDrone.Core.Models;
|
||||
using SQLite;
|
||||
@ -11,10 +12,12 @@ namespace CounterDrone.Core.Services
|
||||
{
|
||||
private readonly SQLiteConnection _db;
|
||||
private readonly ReportGenerator _generator = new();
|
||||
private readonly IPathProvider _paths;
|
||||
|
||||
public ReportService(SQLiteConnection db)
|
||||
public ReportService(SQLiteConnection db, IPathProvider paths)
|
||||
{
|
||||
_db = db;
|
||||
_paths = paths;
|
||||
}
|
||||
|
||||
public SimulationReport Generate(string taskId, TaskFullConfig config,
|
||||
@ -74,5 +77,18 @@ namespace CounterDrone.Core.Services
|
||||
Items = items, TotalCount = total, Page = page, PageSize = pageSize,
|
||||
};
|
||||
}
|
||||
|
||||
public string ExportToFile(string reportId, string outputDir)
|
||||
{
|
||||
var report = _db.Find<SimulationReport>(reportId);
|
||||
if (report == null) throw new ArgumentException($"报告 {reportId} 不存在");
|
||||
|
||||
Directory.CreateDirectory(outputDir);
|
||||
var safeTime = DateTime.UtcNow.ToString("yyyyMMdd_HHmmss");
|
||||
var fileName = $"{report.TaskName}_{safeTime}.md";
|
||||
var filePath = Path.Combine(outputDir, fileName);
|
||||
File.WriteAllText(filePath, report.Content);
|
||||
return filePath;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -213,6 +213,19 @@ namespace CounterDrone.Core.Tests
|
||||
return rec;
|
||||
}
|
||||
|
||||
private void VerifyAndExportReport(SimulationEngine eng, DroneEntity drone)
|
||||
{
|
||||
var detail = _scenario.GetTaskDetail(_taskId)!;
|
||||
var report = new ReportGenerator().Generate(detail, eng.Events.ToList(), drone.Status, eng.SimulationTime);
|
||||
Assert.Contains("成功拦截", report);
|
||||
Assert.Contains(detail.Task.Name, report);
|
||||
|
||||
var svc = new ReportService(_mainDb, _paths);
|
||||
var r = svc.Generate(_taskId, detail, eng.Events.ToList(), drone.Status.ToString(), eng.SimulationTime);
|
||||
var path = svc.ExportToFile(r.Id, Path.Combine(_testDir, "reports"));
|
||||
Assert.True(File.Exists(path));
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════
|
||||
// 场景 1:无防御 — 无人机到达目标
|
||||
// ═══════════════════════════════════════════════
|
||||
@ -347,6 +360,7 @@ namespace CounterDrone.Core.Tests
|
||||
Assert.True(launched > 0, msg);
|
||||
Assert.True(cloudsGenerated > 0, msg);
|
||||
Assert.True(drone.Status == DroneStatus.Destroyed, msg);
|
||||
VerifyAndExportReport(eng, drone);
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════
|
||||
@ -398,11 +412,7 @@ namespace CounterDrone.Core.Tests
|
||||
Assert.True(launched > 0, msg);
|
||||
Assert.True(cloudsGenerated > 0, msg);
|
||||
Assert.True(drone.Status == DroneStatus.Destroyed, msg);
|
||||
|
||||
var detailJ = _scenario.GetTaskDetail(_taskId)!;
|
||||
var report = new ReportGenerator().Generate(detailJ, eng.Events.ToList(), drone.Status, eng.SimulationTime);
|
||||
Assert.Contains("成功拦截", report);
|
||||
Assert.Contains(detailJ.Task.Name, report);
|
||||
VerifyAndExportReport(eng, drone);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ namespace CounterDrone.Core.Tests
|
||||
var paths = new TestPathProvider(_testDir);
|
||||
var dbm = new DatabaseManager(paths);
|
||||
_db = dbm.OpenMainDb();
|
||||
_service = new ReportService(_db);
|
||||
_service = new ReportService(_db, paths);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user