Sqlite 集成测试实体框架代码优先与内存数据库
我想对内存中的数据库进行EF4.1存储库的实际集成测试 我有一个基于遗留数据库的代码优先模型(旧表和列名需要使用代码配置映射到我的实体) 我希望能够使用Sqlite(或其他)来:Sqlite 集成测试实体框架代码优先与内存数据库,sqlite,entity-framework-4.1,ef-code-first,Sqlite,Entity Framework 4.1,Ef Code First,我想对内存中的数据库进行EF4.1存储库的实际集成测试 我有一个基于遗留数据库的代码优先模型(旧表和列名需要使用代码配置映射到我的实体) 我希望能够使用Sqlite(或其他)来: 从我的模型生成内存中的数据库 使用此内存数据库为我的模型创建DBContext 我已经准备好IDBContextFactory的IoC/DI,它是用我的(通用)存储库构建的(也使用GenericRepository模式) 在线的bits和BOB表明这应该是可能的,但对于代码优先的方法来说并不多。有人知道这是否可能吗 我
public class MyDbContextFactory : IDbContextFactory
{
private static object context;
public object CurrentContext
{
get {
if(context == null)
{
// ?? DOESN'T WORK AS THERE'S NO META DATA
var connBuilder = new EntityConnectionStringBuilder();
connBuilder.Provider = "System.Data.SQLite";
connBuilder.Metadata =
@"res://*/TestEfDb.csdl|res://*/TestEfDb.ssdl|res://*/TestEfDb.msl";
connBuilder.ProviderConnectionString =
ConfigurationManager.ConnectionStrings["DataContext"].Name;
var entConnection = new EntityConnection(connBuilder.ConnectionString);
// THROWS ERROR: sqlite Format of the initialization string does not
// conform to specification starting at index 0
// for connection string "Data Source=:memory:;Version=3;New=True;"
//var entConnection = new EntityConnection
// (ConfigurationManager.ConnectionStrings["DataContext"].Name);
context = new MyDbContext(entConnection);
}
return context;
}
}
}
[测试]
公共无效测试_me()
{
var auditRespository=new AuditRepository(new MyDbContextFactory());
auditRespository.GetAll();
}
使用SQL Compact 4.0(通过web平台安装程序下载SqlCE和工具)-EF code first直接支持这一点。唯一的区别是,您的应用程序将使用到大型SQL Server的连接字符串:
<add name="MyDbContext"
provider="System.Data.SqlClient"
connectionString=
"Data Source=...;InitialCatalog=...;Integrated Security=SSPI" />
您的测试将使用连接字符串来压缩SQL:
<add name="MyDbContext"
provider="System.Data.SqlServerCe.4.0"
connectionString="Data Source=Database.sdf" />
看看这篇文章:。它描述了如何将实体框架隐藏在抽象后面,以便可以轻松地对应用程序进行单元测试,同时仍然允许在应用程序代码中对其使用LINQ(over
IQueryable
)查询
注意,这并不能完全消除编写集成测试的需要,因为您仍然需要测试数据库映射层,可能还需要测试所选的LINQ提供程序是否能够执行LINQ查询。您多次首先提到代码,但同时您正在从EDMX文件(设计器)构建引用资源文件的实体连接字符串那么,您使用的是哪种方法呢?引用:“?因为没有元数据而无法工作”其代码非常棒。工作是一种享受。谢谢我仍然不考虑进行单元测试,因为每次测试后都需要进行某种清理,以保持数据库处于一致状态。@Steven:这不是单元测试。这是集成测试,根据我的经验,这是使用IQueryable和EF真正测试代码的唯一有效方法。稍后我将阅读您的链接文章。@Ladislay:当使用任何O/RM工具时,我们需要集成测试。至少我们需要确保映射层被正确定义,我们需要为此进行集成测试。我想我们在这一点上是一致的。但是对于测试业务逻辑来说,单元测试更有价值,因为它们运行得更快,更易于维护。史蒂文:我知道这个理论,我也用过它,但它不适用于在业务逻辑中定义查询。一旦我们运行了did单元测试,我们就使用linq to对象,而不是linq to实体,测试是绿色的,但很多时候,当我们使用EF provider运行相同的查询时,代码不起作用。LINQtoEntities是Linq功能的唯一子集,因此我更喜欢直接使用真实的db提供程序测试查询。
<add name="MyDbContext"
provider="System.Data.SqlServerCe.4.0"
connectionString="Data Source=Database.sdf" />