C# SQL数据库并行集成测试
想要的结果:与实体框架并行运行集成测试,实体框架配置为使用某种强制约束的数据库 当前情况:我有一个带有一些集成测试的项目,我指的是用C# SQL数据库并行集成测试,c#,asp.net,entity-framework,xunit,C#,Asp.net,Entity Framework,Xunit,想要的结果:与实体框架并行运行集成测试,实体框架配置为使用某种强制约束的数据库 当前情况:我有一个带有一些集成测试的项目,我指的是用WebApplicationFactory设置的测试。目前,我使用它与EF核心设置使用内存数据库 protected override void ConfigureWebHost(IWebHostBuilder builder) { ConfigureWebHostBuilder(builder);
WebApplicationFactory
设置的测试。目前,我使用它与EF核心设置使用内存数据库
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
ConfigureWebHostBuilder(builder);
builder.ConfigureTestServices(services =>
{
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
services.AddDbContext<AppDbContext>(options =>
{
options.UseInMemoryDatabase("testDb");
options.UseInternalServiceProvider(serviceProvider);
options.EnableDetailedErrors();
options.EnableSensitiveDataLogging();
});
});
}
受保护的覆盖无效配置WebHost(IWebHostBuilder)
{
配置WebHostBuilder(构建器);
builder.ConfigureTestServices(服务=>
{
var serviceProvider=newservicecolection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
services.AddDbContext(选项=>
{
选项。使用MemoryDatabase(“testDb”);
选项。使用InternalServiceProvider(serviceProvider);
options.EnableDetailedErrors();
options.EnableSensitiveDataLogging();
});
});
}
虽然这是可行的,但问题是它没有强制执行SQL查询,我已经在多个案例中运行过,集成测试显示该功能可以工作,但是当尝试在实际项目运行时重新生成该功能并将EF连接到SQL Server数据库时,该功能由于某些失败的数据库约束而失败
想法:
- 起初我想到在内存数据库中使用SQLite。不起作用,我认为这是并发性问题,因为在每个测试用例开始时,我都会使用
.EnsureDeleted()
.Migrate().EnsureCreated()
- 然后使用带有随机名称的文件创建SQLite。不起作用,因为我无法清除内部DbContext缓存。我确信文件是重新创建和清理的,但DbContext只是有缓存的实体
- 最后,在我发布了一些迁移之后,我可能根本无法使用SQLite,因为它不支持很多迁移类型(删除FK、更改列等)/