二十多个'IServiceProvider'单元测试

问题描述

我收到此错误消息:

生成警告“Microsoft.EntityFrameworkCore.Infrastructure.ManyServiceProvidersCreatedWarning”的错误:已创建超过 20 个“IServiceProvider”实例供实体框架内部使用。这通常是由将新的单例服务实例注入每个 DbContext 实例引起的。例如,每次调用 'UseLoggerFactory' 都会传入一个新实例——有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=869049。这可能会导致性能问题,请考虑查看可能需要构建新服务提供程序的“DbContextOptionsBuilder”调用。可以通过将事件 ID 'CoreEventId.ManyServiceProvidersCreatedWarning' 传递给 'DbContext.OnConfiguring' 或 'AddDbContext' 中的 'ConfigureWarnings' 方法来抑制或记录此异常。

当我一起运行所有单元测试时

设置

private readonly DbContextOptions<ApplicationDbContext> _contextOptions;
private readonly DbContextOptions<ApplicationDbContext> _inMemoryContextOptions;

public TestConstructor()
{
// Test for real database READ
_contextOptions = new DbContextOptionsBuilder<ApplicationDbContext>()
.UsesqlServer(_connectionString)
.Options;

// Test InMemory CREATE UPDATE DELETE
_inMemoryContextOptions = DbContextOptionsBuilder();
SeedInMemoryTestDb(_inMemoryContextOptions);
}

private static DbContextOptions<ApplicationDbContext> DbContextOptionsBuilder()
{
return new DbContextOptionsBuilder<ApplicationDbContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString(),new InMemoryDatabaseRoot())
.Options;
}

单元测试

[FACT] 
public void Test1()
await using var context = new ApplicationDbContext(_contextOptions);
//... Assert.Equal()
[FACT] 
public void Test2()
await using var context = new ApplicationDbContext(_inMemoryContextOptions);
//... Assert.Equal()

我在 5 或 6 年级同时进行设置和单元测试。 我想我需要为每个测试重复使用相同的上下文,但我没有做到这一点。

解决方法

[CollectionDefinition("SharedDbContext")]
public class DatabaseCollection : ICollectionFixture<DatabaseFixture> { }

public class DatabaseFixture : IDisposable
{
    public ApplicationDbContext ApplicationDbContext;
    public ApplicationDbContext InMemoryApplicationDbContext;


    public DatabaseFixture()
    {
        // Test for real database READ
        var contextOptions = new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseSqlServer(_connectionString)
            .Options;
        //// Test InMemory CREATE UPDATE DELETE
        var inMemoryContextOptions = DbContextOptionsBuilder();

        ApplicationDbContext = new ApplicationDbContext(contextOptions);
        InMemoryApplicationDbContext = new ApplicationDbContext(inMemoryContextOptions);

        SeedInMemoryTestDb(inMemoryContextOptions);
    }
}