我使用.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
相关联?
答案 0 :(得分:5)
每个EF Core数据库提供程序都将扩展方法添加到DatabaseFacade
类中,该方法可用于检测上下文的已配置提供程序。
对于SQL Server,它称为IsSqlServer()
,对于MySQL,它称为IsMySql()
,对于SQLite,它称为IsSqlite()
等。对于内存,它的名称为IsInMemory()
:)
void AddRecordX(CoreDbContext context)
{
bool contextIsInMemory = context.Database.IsInMemory();
}
唯一棘手的部分是,由于这些是扩展方法,因此该项目必须引用相应的软件包。
答案 1 :(得分:-2)
为什么在单元测试中直接使用数据库?使用一些模拟库通过模拟“替代”数据库。有很多不错的教程。