단위 테스트를위한 노력 데이터베이스에 저장 프로 시저 만들기

c# effort entity-framework stored-procedures unit-testing

문제

Entity Framework에서 저장 프로 시저를 호출하는 함수가 있습니다.

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

그리고 노력을 사용하여 단위 테스트를 만들고 싶습니다. 나는 이미 각 단위 테스트를 위해 Initialize 에서 데이터베이스 (내 컨텍스트 기반)를 시뮬레이트하기위한 Effort (및 NMemory 데이터베이스)를 가지고있다.

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

EffortProviderFactory :

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

다음과 같이 저장 프로 시저 생성을 추가하여 테스트했습니다.

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

그러나 그것은 NotSupportedException 던집니다. 나는 어떻게 할 수 있고, 최선의 방법은 무엇인가?

수락 된 답변

EffortDbContext 인스턴스에 개인 소유의 임시 데이터베이스 (새 컨텍스트, 새 데이터베이스, 테스트 상호 작용 없음)를 제공하는 파일 기반 메모리 내 데이터베이스 공급자입니다. 그것은 좋은 부분입니다.

단점은 물론 완전한 데이터베이스 엔진이 아니라는 것입니다. 따라서 일반적인 SQL 언어 (t-SQL 또는 PL-SQL과 같은)로 작성된 저장 프로 시저를 지원 하지 않습니다 . Effort (즉, NMemory)가 프로 시저를 저장하는 한 StoredProcedure 생성자 에서와 같이 저장된 IQueryable 일뿐입니다. t-SQL 저장 프로 시저와 관련된 원격주의.

데이터 액세스 계층 코드에서 저장 프로 시저를 테스트하는 유일한 방법은 통합 테스트를 작성하는 것입니다. 통합 테스트를 서로 독립적으로 만드는 데는 대략 두 가지 방법이 있습니다.

  • 각 테스트에 대해 새 데이터베이스 만들기 / 시드

  • 테스트 케이스가있는 기존 데이터베이스를 사용하고 각 테스트 후에 변경 사항을 롤백 합니다 (예 : TransactionScope 사용) .

통합 테스트는 단위 테스트만큼 빠른 것은 아니며 단위 테스트 만 보완 하지만 그럼에도 불구하고 데이터 계층과 관련한 자체 코딩 연습에서는 테스트 제품군의 일류 시민이되었습니다. 나를 위해 정확성이 속도보다 중요합니다.




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