Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在没有实际的SQL Server数据库启动和运行的情况下,如何配置努力测试工具来模拟实体框架的DbContext?_Sql Server_Entity Framework_Unit Testing_Mocking_Effort - Fatal编程技术网

Sql server 在没有实际的SQL Server数据库启动和运行的情况下,如何配置努力测试工具来模拟实体框架的DbContext?

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 * 更新:

我们团队的应用程序开发包括使用努力测试工具模拟实体框架的DbContext。然而,为了模拟实体框架的DbContext,似乎需要查看应用程序使用的实际SQL Server数据库,这似乎违反了适当的单元测试原则

原因是为了通过模拟任何与数据库连接相关的东西(例如EntityFramework的DbContext)来单元测试我们的应用程序代码,我们永远不需要数据库来启动和运行

在没有实际的SQL Server数据库启动和运行的情况下,如何配置努力测试工具来模拟实体框架的DbContext

* 更新:

@gert arnold我们使用实体框架模型优先的方法来实现后端模型和数据库

以下摘录自测试代码:

        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));
}