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);
|
SimulationReport GetReport(string id);
|
||||||
void DeleteReport(string id);
|
void DeleteReport(string id);
|
||||||
PagedResult<SimulationReport> SearchReports(string keyword, string? dateFrom, string? dateTo, int page, int pageSize);
|
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;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using CounterDrone.Core.Models;
|
using CounterDrone.Core.Models;
|
||||||
using SQLite;
|
using SQLite;
|
||||||
@ -11,10 +12,12 @@ namespace CounterDrone.Core.Services
|
|||||||
{
|
{
|
||||||
private readonly SQLiteConnection _db;
|
private readonly SQLiteConnection _db;
|
||||||
private readonly ReportGenerator _generator = new();
|
private readonly ReportGenerator _generator = new();
|
||||||
|
private readonly IPathProvider _paths;
|
||||||
|
|
||||||
public ReportService(SQLiteConnection db)
|
public ReportService(SQLiteConnection db, IPathProvider paths)
|
||||||
{
|
{
|
||||||
_db = db;
|
_db = db;
|
||||||
|
_paths = paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SimulationReport Generate(string taskId, TaskFullConfig config,
|
public SimulationReport Generate(string taskId, TaskFullConfig config,
|
||||||
@ -74,5 +77,18 @@ namespace CounterDrone.Core.Services
|
|||||||
Items = items, TotalCount = total, Page = page, PageSize = pageSize,
|
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;
|
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:无防御 — 无人机到达目标
|
// 场景 1:无防御 — 无人机到达目标
|
||||||
// ═══════════════════════════════════════════════
|
// ═══════════════════════════════════════════════
|
||||||
@ -347,6 +360,7 @@ namespace CounterDrone.Core.Tests
|
|||||||
Assert.True(launched > 0, msg);
|
Assert.True(launched > 0, msg);
|
||||||
Assert.True(cloudsGenerated > 0, msg);
|
Assert.True(cloudsGenerated > 0, msg);
|
||||||
Assert.True(drone.Status == DroneStatus.Destroyed, 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(launched > 0, msg);
|
||||||
Assert.True(cloudsGenerated > 0, msg);
|
Assert.True(cloudsGenerated > 0, msg);
|
||||||
Assert.True(drone.Status == DroneStatus.Destroyed, msg);
|
Assert.True(drone.Status == DroneStatus.Destroyed, msg);
|
||||||
|
VerifyAndExportReport(eng, drone);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,7 +23,7 @@ namespace CounterDrone.Core.Tests
|
|||||||
var paths = new TestPathProvider(_testDir);
|
var paths = new TestPathProvider(_testDir);
|
||||||
var dbm = new DatabaseManager(paths);
|
var dbm = new DatabaseManager(paths);
|
||||||
_db = dbm.OpenMainDb();
|
_db = dbm.OpenMainDb();
|
||||||
_service = new ReportService(_db);
|
_service = new ReportService(_db, paths);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user