2010-04-24 5 views
7

TypeMock Islolator를 사용하지 않고도 완료 할 수 있습니까? 메타 데이터 만 연결 문자열을 전달하는 것과 같은 몇 가지 제안을 온라인에서 찾았습니다.하지만 TypeMock 이외에는 아무 것도 나오지 않았습니다. 단위 테스트를 위해 서비스에 주입 할 수있는 mock ObjectContext를 허용하는 것 같습니다. TypeMock에 대한 $$을 (를) 쓰다듬어 야합니까, 아니면 대안이 있습니까? 아무도 오픈 소스 인 TypeMock과 비슷한 것을 만들 수 없었습니까?EF4 - 단위 테스트를 위해 ObjectContext를 조롱 할 수 있습니까?

+1

내가 본 한 가지 제안은 db에 대해 다시 테스트하는 규칙을 어기는 것입니다. 그 사람은 CreateDatabase()를 사용하여 파리에서 "모의"db 인스턴스를 로컬로 생성한다고 말했습니다. 일반적으로 이전 프로젝트에서이 규칙을 위반했을 때이 문제를 피하고자합니다. ~ 600 테스트까지는 괜찮 았지만 2000 년 테스트를 마친 후에는 진정한 TDD에서는 전혀 쓸모가 없었습니다. 테스트를 "일괄 처리 모드"로 실행 한 결과 (실행 시간이 5 분 이상 소요되었습니다). –

답변

4

나는 조롱하지 않고 쉽게 EF4를 테스트하고 있습니다. 내가 한 작업은 http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/의 코드를 사용하여 저장소 인터페이스를 작성한 다음 IRepository 인터페이스를 사용하는 InMemoryRepository<T> 클래스를 작성한 것입니다. 그런 다음 IObjectSet<T>을 클래스 내부의 List<T>으로 바꾸고 그에 따라 검색 방법을 변경했습니다.

따라서 단위 테스트를 수행해야하는 경우 DataRepository 대신 InMemoryRepository를 전달하십시오.

+1

-1 Linq2Objects는 Linq2Entities와 다르게 동작합니다. 테스트는 목록에 대해 통과 할 수 있지만 EF로 SQL로 구문 분석하면 실패합니다. –

+0

데이터베이스에 액세스하지 않고도이를 전달할 수있는 방법이 없으므로 귀하의 요점은 확실하지 않습니다. 조롱은 Linq2Entities가 항상 유효하고 올바르게 작동한다는 것을 의미하지 않습니다. – KallDrexx

+2

쿼리를 캡슐화하고 실제 데이터베이스와 비교하여 테스트하십시오. 그런 다음 비즈니스 논리를 테스트 할 때 조롱하십시오. 따라서 각 쿼리는 사실에 대해 알고있는 재사용 가능한 구성 요소입니다. 그리고 예상 상태에있는 데이터베이스를 요구하지 않고 비즈니스 로직을 테스트합니다. –

1

프록시 클래스에서 ObjectContext를 래핑하십시오. 그런 다음 그것을 수업에 삽입하십시오.

+0

예 시도해 보았지만 가능성이 있습니다. 그러나 프록시를 사용하는 이러한 모든 접근 방식에는 고유 한 제한이 있습니다. Linq는 한 가지만 다른 방식으로 작동합니다 (개체에 대한 Linq와 개체 대 Linq). –

+2

TRue,하지만 단위 테스트가 다른 Linq 구현의 차이점을 찾아 낼 것으로 기대하는 것은 Unit Tests의 경우 다소 오버 보입니다. 통합 테스트 분야에서 더 그렇다고 생각하지 않습니까? – SamuelWarren

3

Linq2Entity 쿼리를 인터페이스 뒤에두고 실제 데이터베이스와 분리하여 테스트하십시오.

쿼리 인터페이스에 대한 mocks로 비즈니스 로직 테스트를 작성하십시오. 린크가 당신의 비즈니스 논리에 피를 흘리지 않게하십시오!

RepositoryPattern을 사용하지 마십시오!

0

내가 저장소 패턴이 질문에 대한 유일한 해답이라고 생각하지 않습니다

나는이 대답을 좋아했다 (그것은 확실히 문제 방지) - 나는 기존의 코드베이스에 테스트를 도입 더 적절한 생각을 Creating Interface for ObjectContext