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

View File

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

View File

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

View File

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