在我的Xunit测试启动期间,我正在使用带有假数据的假版本FakeMyDbContext为实体框架数据库上下文定义依赖注入。
public void ConfigureInMemoryDatabases(IServiceCollection services)
{
services.AddScoped(_ =>
{
var smtrOptions = new DbContextOptionsBuilder<MyDbContext>()
.UseInMemoryDatabase(databaseName: $"MyDb_{Guid.NewGuid()}")
.Options;
return new FakeMyDbContext(smtrOptions) as MyDbContext;
});
}
对于使用该数据库上下文的服务,我运行了多个测试,但是只运行了一个。我已经在FakeMyDbContext类的处置中找到了以下行问题:
public override void Dispose()
{
base.Dispose();
Database.EnsureDeleted();
}
如果删除Database.EnsureDeleted(),则运行所有测试。如果我保留它,那么只运行一次测试。我不知道为什么会发生这种情况,因为我没有看到任何错误,每个上下文实例都有一个唯一的数据库名称(附加的guid)。
我的问题的原因是,我调用EnsureDeleted后处置上下文。
处置方法应该如下所示
public override void Dispose()
{
Database.EnsureDeleted();
base.Dispose();
}