如何配置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合法嗎? 是的,了解原因