在《EF单元测试中内存数据库的局限性》译文中,曾经指出Sqlite作为内存数据库进行单元测试的局限性,但随着技术的发展,Sqlite作为内存数据库对EF Core进行单元测试已经变得比较方便。在单元测试中,我们可以使用下面代码创建依赖注入服务:
internal static IServiceProvider GetServiceProvider(IConfiguration Configuration)
{
var services = new ServiceCollection();
services.AddEntityFrameworkSqlServer().AddDbContext<MyDbContext>(option =>
{
option.UseSqlite(CreateInMemoryDatabase());
});
var serviceProvider= services.BuildServiceProvider(); ;
return serviceProvider;
}
private static DbConnection CreateInMemoryDatabase()
{
var connection = new SqliteConnection("Filename=:memory:");
connection.Open();
return connection;
}
public static MyDbContext GetDbContext(IServiceProvider provider)
{
return provider.GetService(typeof(MyDbContext)) as MyDbContext;
}
然后,在单元测试中,我们可以使用myDbContext.Database.EnsureCreated(); 创建数据库中的表,这样就可以很方便地进行单元测试了。