实验成绩导出

This commit is contained in:
biss committed 2026-08-21 17:51:33 +08:00
1 parent bcdb00ee2e
commit 4446cfbd30
3 files changed
+194

No files matched your search

@@ -14,6 +14,92 @@ namespace Jiaowu.Api.Tests;
public sealed class ExperimentGradesControllerTests
{
[Fact]
public async Task ExportTeachingTaskScores_IncludesEveryProjectAndPublishedTotal()
{
await using var fixture = await ExperimentGradeFixture.CreateAsync();
var firstProject = new ExperimentProject
{
TeachingTaskId = fixture.Task.Id,
Code = "LAB-EXPORT-1",
Name = "实验一",
ArrangementMode = ExperimentArrangementMode.Centralized,
StartDate = fixture.Term.StartDate,
EndDate = fixture.Term.EndDate,
Status = ExperimentProjectStatus.Published,
PublishedAt = DateTime.UtcNow
};
var secondProject = new ExperimentProject
{
TeachingTaskId = fixture.Task.Id,
Code = "LAB-EXPORT-2",
Name = "实验二",
ArrangementMode = ExperimentArrangementMode.Centralized,
StartDate = fixture.Term.StartDate,
EndDate = fixture.Term.EndDate,
Status = ExperimentProjectStatus.Published,
PublishedAt = DateTime.UtcNow
};
fixture.Db.ExperimentProjects.AddRange(firstProject, secondProject);
await fixture.Db.SaveChangesAsync();
fixture.Db.ExperimentGradeSheets.AddRange(
new ExperimentGradeSheet
{
ExperimentProjectId = firstProject.Id,
ContributionWeight = 1,
PassScore = 60,
Status = ExperimentGradeSheetStatus.Published,
PublishedAt = DateTime.UtcNow,
Records =
[
new ExperimentGradeRecord
{
StudentId = fixture.Student.Id,
ParticipationStatus = ExperimentParticipationStatus.Completed,
TotalScore = 80,
IsPassed = true
}
]
},
new ExperimentGradeSheet
{
ExperimentProjectId = secondProject.Id,
ContributionWeight = 3,
PassScore = 60,
Status = ExperimentGradeSheetStatus.Published,
PublishedAt = DateTime.UtcNow,
Records =
[
new ExperimentGradeRecord
{
StudentId = fixture.Student.Id,
ParticipationStatus = ExperimentParticipationStatus.Completed,
TotalScore = 90,
IsPassed = true
}
]
});
await fixture.Db.SaveChangesAsync();
await ExperimentGradeAggregationService.RefreshTeachingTaskAsync(
fixture.Db,
fixture.Task.Id,
CancellationToken.None);
fixture.Db.ChangeTracker.Clear();
var file = Assert.IsType<FileContentResult>(await fixture
.ExperimentGrades(fixture.AdminScope)
.ExportTeachingTaskScores(fixture.Task.Id, CancellationToken.None));
await using var stream = new MemoryStream(file.FileContents);
using var workbook = new XLWorkbook(stream);
var worksheet = workbook.Worksheet("课程实验成绩");
Assert.Equal("LAB-EXPORT-1·实验一(已发布)", worksheet.Cell(1, 9).GetString());
Assert.Equal("LAB-EXPORT-2·实验二(已发布)", worksheet.Cell(1, 10).GetString());
Assert.Equal("实验合成总分(仅已发布项目)", worksheet.Cell(1, 11).GetString());
Assert.Equal("80", worksheet.Cell(2, 9).GetFormattedString());
Assert.Equal("90", worksheet.Cell(2, 10).GetFormattedString());
Assert.Equal("87.5", worksheet.Cell(2, 11).GetFormattedString());
}
[Fact]
public async Task UpdateSettings_ReplacesItemsAndRecreatesScores()
{