2

我们团队的应用程序开发涉及使用努力测试工具来模拟我们的实体框架的 DbContext。但是,似乎 Effort Testing Tool 需要查看应用程序使用的实际 SQL Server 数据库,以便模拟我们的实体框架的 DbContext,这似乎违反了正确的单元测试原则。

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

在没有实际 SQL Server 数据库启动和运行的情况下,我将如何配置 Effort Testing Tool 来模拟 Entity Framework 的 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);

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

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

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

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

4

1 回答 1

4

您只需要该连接字符串,因为 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));
}
于 2015-01-05T23:36:17.113 回答