如何测试DbContext是否在内存中?

时间:2018-10-17 06:37:17

标签: entity-framework entity-framework-core entity-framework-core-2.1

我使用.Net Core 2.1.,我的应用程序使用Entity Framework Core,并且上下文CoreDbContext源自DbContext

对于单元测试,我使用了CoreDbContext的内存版本,因此在我的Startup.cs中产生了以下代码:

if (useInMemoryDatabase)
{
    services.AddDbContext<CoreDbContext>(options => 
           options.UseInMemoryDatabase("dbname"));
}
else
{
    services
      .AddDbContext<CoreDbContext>(options => 
           options.UseSqlServer(DefaultDbConnectionString));
}

我也有一些通过上下文访问数据库的方法。这些有时有时需要知道上下文是否在内存中,因为内存上下文的行为与普通上下文不同:

void AddRecordX(CoreDbContext context)
{
    bool contextIsInMemory = .....;

}

如何测试上下文是在内存中还是与真实的SQL Server database相关联?

2 个答案:

答案 0 :(得分:5)

每个EF Core数据库提供程序都将扩展方法添加到DatabaseFacade类中,该方法可用于检测上下文的已配置提供程序。

对于SQL Server,它称为IsSqlServer(),对于MySQL,它称为IsMySql(),对于SQLite,它称为IsSqlite()等。对于内存,它的名称为IsInMemory():)

void AddRecordX(CoreDbContext context)
{
    bool contextIsInMemory = context.Database.IsInMemory();
}

唯一棘手的部分是,由于这些是扩展方法,因此该项目必须引用相应的软件包。

答案 1 :(得分:-2)

为什么在单元测试中直接使用数据库?使用一些模拟库通过模拟“替代”数据库。有很多不错的教程。