ReportService 添加 ExportToFile, 集成测试验证报告文件输出, 116测试5秒完成

This commit is contained in:
tian 2026-06-11 16:12:56 +08:00
parent 4db30131e9
commit 5b168f202e
4 changed files with 35 additions and 7 deletions

View File

@ -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);
} }
} }

View File

@ -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;
}
} }
} }

View File

@ -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);
} }
} }
} }

View File

@ -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()