Sql server 在没有实际的SQL Server数据库启动和运行的情况下,如何配置努力测试工具来模拟实体框架的DbContext?
我们团队的应用程序开发包括使用努力测试工具模拟实体框架的DbContext。然而,为了模拟实体框架的DbContext,似乎需要查看应用程序使用的实际SQL Server数据库,这似乎违反了适当的单元测试原则 原因是为了通过模拟任何与数据库连接相关的东西(例如EntityFramework的DbContext)来单元测试我们的应用程序代码,我们永远不需要数据库来启动和运行 在没有实际的SQL Server数据库启动和运行的情况下,如何配置努力测试工具来模拟实体框架的DbContext * 更新: @gert arnold我们使用实体框架模型优先的方法来实现后端模型和数据库 以下摘录自测试代码:Sql server 在没有实际的SQL Server数据库启动和运行的情况下,如何配置努力测试工具来模拟实体框架的DbContext?,sql-server,entity-framework,unit-testing,mocking,effort,Sql Server,Entity Framework,Unit Testing,Mocking,Effort,我们团队的应用程序开发包括使用努力测试工具模拟实体框架的DbContext。然而,为了模拟实体框架的DbContext,似乎需要查看应用程序使用的实际SQL Server数据库,这似乎违反了适当的单元测试原则 原因是为了通过模拟任何与数据库连接相关的东西(例如EntityFramework的DbContext)来单元测试我们的应用程序代码,我们永远不需要数据库来启动和运行 在没有实际的SQL Server数据库启动和运行的情况下,如何配置努力测试工具来模拟实体框架的DbContext * 更新:
connection = Effort.EntityConnectionFactory.CreateTransient("name=NorthwindModel");
jsAudtMppngPrvdr = new BlahBlahAuditMappingProvider();
fctry = new BlahBlahDataContext(jsAudtMppngPrvdr, connection, false);
qryCtxt = new BlahBlahDataContext(connection, false);
audtCtxt = new BlahBlahAuditContext(connection, false);
mockedReptryCtxt = new BlahBlahDataContext(connection, false);
_repository = fctry.CreateRepository<Account>(mockedReptryCtxt, null);
_repositoryAccountRoleMaps = fctry.CreateRepository<AccountRoleMap>(null, _repository);
您能解释一下上述代码应该如何重写吗?您只需要那个连接字符串,因为您需要知道EDMX文件在哪里 EDMX文件包含使用数据库中的相同架构创建inmemory存储所需的所有信息。您必须指定一个连接字符串,因为我认为如果用户不必弄乱EDMX路径,这会很方便 如果您检查CreateTransient方法的实现,您将看到它只使用连接字符串获取其元数据部分
public static EntityConnection CreateTransient(string entityConnectionString, IDataLoader dataLoader)
{
var metadata = GetEffortCompatibleMetadataWorkspace(ref entityConnectionString);
var connection = DbConnectionFactory.CreateTransient(dataLoader);
return CreateEntityConnection(metadata, connection);
}
private static MetadataWorkspace GetEffortCompatibleMetadataWorkspace(ref string entityConnectionString)
{
entityConnectionString = GetFullEntityConnectionString(entityConnectionString);
var connectionStringBuilder = new EntityConnectionStringBuilder(entityConnectionString);
return MetadataWorkspaceStore.GetMetadataWorkspace(
connectionStringBuilder.Metadata,
metadata => MetadataWorkspaceHelper.Rewrite(
metadata,
EffortProviderConfiguration.ProviderInvariantName,
EffortProviderManifestTokens.Version1));
}
数据库仅用于将数据加载到临时上下文中。另一种方法是从CSV文件加载数据,但我认为数据库更方便。我认为需要了解SQL Server数据库架构布局,这也是我创建临时实体连接的唯一原因,该连接名与应用程序使用的实际SQL Server数据库相连接。努力测试工具了解SQL Server数据库的模式布局,这样我就可以创建测试实体之间关系的测试,这不是更好吗?如何配置Effort Testing Tool来模拟实体框架的DbContext,使Effort知道数据库的模式布局,但没有实际的SQL Server数据库启动和运行?我不明白您希望如何处理db模式。EF也不提供API来访问模式本身,这是ORM的全部要点。为了测试实体之间的关系,我会使用一个新的上下文,获取实体并测试它们的内容引用、集合。嘿,你能看看我对帖子的更新吗?提前感谢您的帮助。@alex sorokoletov我正试图重写我的基于工作的测试代码,以确保在执行基于工作的单元测试时,我不需要启动和运行数据库,从而符合正确的单元测试实践。你能看一下我的帖子吗?
public static EntityConnection CreateTransient(string entityConnectionString, IDataLoader dataLoader)
{
var metadata = GetEffortCompatibleMetadataWorkspace(ref entityConnectionString);
var connection = DbConnectionFactory.CreateTransient(dataLoader);
return CreateEntityConnection(metadata, connection);
}
private static MetadataWorkspace GetEffortCompatibleMetadataWorkspace(ref string entityConnectionString)
{
entityConnectionString = GetFullEntityConnectionString(entityConnectionString);
var connectionStringBuilder = new EntityConnectionStringBuilder(entityConnectionString);
return MetadataWorkspaceStore.GetMetadataWorkspace(
connectionStringBuilder.Metadata,
metadata => MetadataWorkspaceHelper.Rewrite(
metadata,
EffortProviderConfiguration.ProviderInvariantName,
EffortProviderManifestTokens.Version1));
}