sql-server - 在没有实际的 SQL Server 数据库启动和运行的情况下,我将如何配置工作量测试工具来模拟 Entity Framework 的 DbContext?

标签 sql-server entity-framework unit-testing mocking effort

我们团队的应用程序开发涉及使用工作量测试工具来模拟我们的 Entity Framework 的 DbContext。然而,工作量测试工具似乎需要查看应用程序使用的实际 SQL Server 数据库,以便模拟我们的 Entity Framework 的 DbContext,这似乎违反了正确的单元测试原则。

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

如何配置工作量测试工具来模拟 Entity Framework 的 DbContext,而无需启动并运行实际的 SQL Server 数据库?

* 更新:

@gert-arnold 我们正在使用 Entity Framework 模型优先方法来实现后端模型和数据库。

以下摘录自测试代码:

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

“name=NorthwindModel”与我们的 edmx 文件相关,其中包含有关数据库表的信息 以及它们的对应关系。

如果我通过像下面的代码行那样建立连接来删除“name=NorthwindModel”,则会收到一条错误消息,指出它需要一个参数:

   connection = Effort.EntityConnectionFactory.CreateTransient(); // throws error

您能解释一下上述代码应该如何重写吗?

最佳答案

您只需要该连接字符串,因为 Effort 需要知道 EDMX 文件在哪里。

EDMX 文件包含创建具有与数据库中相同架构的内存存储所需的所有信息。您必须指定一个连接字符串,只是因为我认为如果用户不必弄乱 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));
}

关于sql-server - 在没有实际的 SQL Server 数据库启动和运行的情况下,我将如何配置工作量测试工具来模拟 Entity Framework 的 DbContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27716714/

相关文章:

c# - 避免多余的条件语句

c++ - 如何使用 .c 文件而不是 .cpp 文件在 google test 中编写测试类?

django - Django 自己的登录测试用例不遵循可定制的身份验证后端。为什么?

sql - 查询当天多笔交易

sql - 将两列数据合并为一列,留下空值

.net - EF 4.0 支持哪些功能?

entity-framework - 如何将 Entity Framework 包含在我的 Azure 辅助角色部署中?

c# - 如何为SQL Server和MySql制作数据访问层

c# - AngularJS .Net WebAPI 上传图片并保存到数据库(MSSQL)

python - 具有 side_effect 的模拟类属性