如何配置Effort Testing Tool以模拟实体框架的DbContext并启动并运行实际的SQL Server数据库?


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

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

如何配置Effort Testing Tool以模拟实体框架的DbContext并启动并运行实际的SQL Server数据库?

*更新:

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

以下摘录来自测试代码:

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

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

一般承认的答案

您只需要该连接字符串,因为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));
}




许可下: CC-BY-SA
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因