using System.Runtime.CompilerServices; using BuildFlow.Shared.Domain.Common; using File.Infrastructure.Persistence; using Microsoft.EntityFrameworkCore; namespace BuildFlow.File.Tests; /// /// file 模块 InMemory 测试数据库工厂。每个用例使用独立库名,并在保存前自动补齐审计字段 /// (IAuditable / IHasOperatorIP),避免实体因必填审计列缺失而失败。 /// internal static class FileTestDb { public static FileDbContext Create([CallerMemberName] string testName = "") { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase($"file-{testName}-{Guid.NewGuid():N}") .Options; var db = new FileDbContext(options); db.SavingChanges += FillAuditFields; return db; } private static void FillAuditFields(object? sender, EventArgs args) { if (sender is not FileDbContext db) return; foreach (var entry in db.ChangeTracker.Entries()) { if (entry.Entity is IAuditable auditable) { auditable.CreatedBy ??= "test"; auditable.UpdatedBy ??= "test"; if (auditable.CreatedAt == default) auditable.CreatedAt = DateTime.UtcNow; if (auditable.UpdatedAt == default) auditable.UpdatedAt = DateTime.UtcNow; } if (entry.Entity is IHasOperatorIP operatorEntity) operatorEntity.OperatorIP ??= "127.0.0.1"; } } }