修复实验成绩评分方案保存的外键失败

This commit is contained in:
biss committed 2026-08-21 17:44:28 +08:00
1 parent 0e02d446ba
commit bcdb00ee2e
2 files changed
+95 -9

No files matched your search

@@ -14,6 +14,74 @@ namespace Jiaowu.Api.Tests;
public sealed class ExperimentGradesControllerTests
{
[Fact]
public async Task UpdateSettings_ReplacesItemsAndRecreatesScores()
{
await using var fixture = await ExperimentGradeFixture.CreateAsync();
var project = new ExperimentProject
{
TeachingTaskId = fixture.Task.Id,
Code = "LAB-SETTINGS",
Name = "评分方案更新实验",
ArrangementMode = ExperimentArrangementMode.Centralized,
StartDate = fixture.Term.StartDate,
EndDate = fixture.Term.EndDate,
Status = ExperimentProjectStatus.Published,
PublishedAt = DateTime.UtcNow
};
fixture.Db.ExperimentProjects.Add(project);
await fixture.Db.SaveChangesAsync();
var administrator = fixture.ExperimentGrades(fixture.AdminScope);
await administrator.CreateSheet(
new ExperimentGradeSheetRequest(
project.Id,
1,
60,
[new ExperimentGradeItemRequest(
"旧评分项",
ExperimentGradeItemKind.Operation,
100)]),
CancellationToken.None);
var sheetId = await fixture.Db.ExperimentGradeSheets
.Select(sheet => sheet.Id)
.SingleAsync();
fixture.Db.ChangeTracker.Clear();
Assert.IsType<NoContentResult>(await administrator.UpdateSettings(
sheetId,
new ExperimentGradeSettingsRequest(
1,
60,
[
new ExperimentGradeItemRequest(
"操作",
ExperimentGradeItemKind.Operation,
60),
new ExperimentGradeItemRequest(
"报告",
ExperimentGradeItemKind.Report,
40)
]),
CancellationToken.None));
fixture.Db.ChangeTracker.Clear();
var updatedSheet = await fixture.Db.ExperimentGradeSheets
.Include(sheet => sheet.Items)
.Include(sheet => sheet.Records)
.ThenInclude(record => record.ItemScores)
.SingleAsync(sheet => sheet.Id == sheetId);
Assert.Equal(["操作", "报告"], updatedSheet.Items
.OrderBy(item => item.SortOrder)
.Select(item => item.Name));
var record = Assert.Single(updatedSheet.Records);
Assert.Equal(2, record.ItemScores.Count);
Assert.All(record.ItemScores, score => Assert.Null(score.Score));
Assert.All(record.ItemScores, score => Assert.Contains(
updatedSheet.Items,
item => item.Id == score.ExperimentGradeItemId));
}
[Fact]
public async Task CollegeAdmin_CanPublishApprovedExperimentGradeSheet()
{