Entity Framework의 DbContext와 실제 SQL Server 데이터베이스를 조롱하도록 노력 테스트 도구를 구성하는 방법은 무엇입니까?

effort entity-framework mocking sql-server unit-testing

문제

우리 팀의 응용 프로그램 개발에는 Effort Testing Tool을 사용하여 Entity Framework의 DbContext를 조롱합니다. 그러나 Effort Testing Tool은 적절한 단위 테스트 원칙에 어긋나는 Entity Framework의 DbContext를 모방하기 위해 응용 프로그램이 사용하는 실제 SQL Server 데이터베이스를 확인해야합니다.

그 이유는 데이터베이스 연결 (예 : Entity Framework의 DbContext)과 관련된 모든 것을 조롱하여 응용 프로그램 코드를 단위 테스트하려면 데이터베이스를 설치하고 실행하지 않아야합니다.

Entity Framework의 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 with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.