Как настроить инструмент тестирования усилий для моделирования DbContext Entity Framework с использованием и фактической базы данных SQL Server?

effort entity-framework mocking sql-server unit-testing

Вопрос

Разработка приложений нашей команды включает использование инструмента тестирования усилий, чтобы высмеять наш DbContext платформы Entity Framework. Тем не менее, кажется, что Инструмент тестирования усилий должен видеть фактическую базу данных SQL Server, которую использует приложение, чтобы издеваться над DbContext нашей платформы Entity Framework, которая, похоже, противоречит соответствующим принципам Unit Testing.

Причина в том, что для модульного тестирования нашего кода приложения, насмехаясь над тем, что связано с подключением к базе данных (например, DbContext Entity Framework), нам не нужно никогда не запускать и запускать базу данных.

Как настроить инструмент тестирования усилий для моделирования DbContext Entity Framework с использованием и фактической базы данных 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 содержит всю информацию, необходимую для создания хранилища 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));
}



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему