2010-06-04 4 views
2

저는 도메인 서비스를 데이터 소스에서 분리하여 단위 테스트에서 테스트 할 수있는 방법을 조사했습니다. 나는 그것들을 완전히 감추는 것이 불가능하다고 생각하기 시작했습니다.ObjectQuery.Include (문자열) 메서드를 사용하여 ObjectContext를 조롱 했습니까?

정보가 적당합니다 (예 : questionblog post). 특히 블로그 게시물을 통해 ObjectContext를 조롱 거리로 만들 수 있습니다.

public IQueryable<Client> GetClients() 
{ 
    return ObjectContext.Clients 
     .Include("Foo") 
     .Include("Bar") 
     .Where(c => c.IsBaz); 
} 

(어디 인터페이스에서 캡처되지 그것이 ObjectQuery<T>를 반환으로 완전히의 Include 방법을 조롱 할 수 것, 및 방법을 포함하지 않습니다

는하지만 내 DomainServices이 같은 방법을 IObjectQuery 인터페이스는 없습니다). ObjectQueryIQueryable<T>을 구현하므로 IQueryable을 반환하는 내 자신의 Include 메서드를 만드는 것이 좋겠다고 생각했지만 쿼리 당 최대 한 번만 호출하도록 호출해야합니다.

EF4, .NET 4, Silverlight 4 및 RIA Services RTW를 사용하고 있습니다. 호언 장담의 비트로서

, 나는 RIA 서비스 엔티티 및 확장하여 테스트 비우호적 인 LINQ가

답변

1

난 당신이 그 수준에서 단위 테스트를해야한다고 생각하지 않습니다 :(방법에 실망. I ' m 단위 테스트를 위해 모든 것이 가능하지만 어떤 부분을 멈출 필요가 있습니다.

코드는 ClientsLinqRepository의 일부로, IClientsLinqRepository를 구현합니다. IClientsLinqRepository를 모의합니다. 그것.

위의 내용이 완벽하게 유효하지만 ClientsLinqRepository는 통합 구현 도구입니다. ation. IMessageSender가 있고 MailSender를 구현 한 경우와 매우 비슷합니다. 여기에는 주요 책임이 별도의 시스템과 통합된다는 코드가 있습니다. 이는 데이터베이스라는 것입니다.

위의 시나리오를 기반으로 중점적 통합 테스트을 해당 클래스에 사용하는 것이 좋습니다. 따라서이 경우 외부 시스템 (데이터베이스)을 공격하고 통합 코드가 외부 시스템과 적절하게 작동하는지 확인해야합니다. 이 기능을 사용하면 나머지 시스템의 복잡성을 처리하지 않고도 코드에서 데이터베이스와 데이터베이스가 분리되었는지 신속하게 확인할 수 있습니다 (다른 레벨에서 통합 테스트를 할 때 어려움).

단위 테스트와 분리 된 집중 테스트를 유지하면 원하는만큼 놀랄만큼 빠른 단위 테스트를 실행할 수 있으며 통합 피스가 변경 될 때마다 통합 테스트를 실행할 수 있습니다.

+0

이런 테스트를 단위 테스트 대신 통합하는 것이 맞습니다. 아마도 하나의 해결책 일 것입니다. 비록 내가 약간의 경찰관 인 것 같은 느낌이 들지만. 내 DomainService에는 단위 테스트를 원하는 메소드가 있습니다. 이는 유효한 요청입니다. 그것은 어떤 데이터를 나타낼 지 결정할 때 앱의 진짜 부분입니다. 유닛 테스트를 목적으로 DomainServices를 조롱하는 것은 아주 일반적인 주제입니다. LINQ to SQL을 사용하는 대부분의 예제는 좀 더 쉽게 조롱되었으므로 SQL을 사용합니다. –

+0

나는 그것이 당신의 DomainService에 있다는 것을 놓쳤습니다. 솔직히 나는 DDD 용어에 정통하지는 않지만 DB로부터의 객체 검색은 도메인 서비스가 요구하는 것처럼 보이지 않는다. 사람들은 서비스를 DDD에서나 그렇지 않은 다른 많은 것들을 호출한다. 나는 이것을 다음과 같이 보았습니다 : 객체 검색/데이터베이스 통합의 책임을 도메인 서비스가 수행하는 다른 로직과 섞어 보았습니까? 책임을 물어 보는 코드일지도 모릅니다.단위 테스트에서 실제 논리를 테스트하고 집중적 인 통합 테스트에서 실제 통합을 테스트 할 수 있습니다. – eglasius

+0

DomainService는 클라이언트가 데이터를 검색하기 위해 호출하는 끝점입니다. 그러나 실제 데이터 검색을 수행하지는 않습니다. 일반적으로 실제 데이터 검색을 수행 할 객체가 있습니다 (LinqToEntitiesDomainService를 확장 한 DomainService의 경우 데이터베이스에서 데이터를 가져 오기 위해 'ObjectContext'를 요청합니다) 엔티티에 LINQ 사용). ObjectContext는 모의 실험을하기 위해 DomainService 모의 데이터를 제공 할 수 있습니다 ... –

관련 문제