2011-12-05 5 views
0

다음 프로젝트에서 모든 저장소 클래스를 버리고 서비스 클래스에서 직접 ISession을 사용하려고합니다. 그 이유는 내 리포지토리 클래스가 호출을 ORM으로 전달하는 경향이 있기 때문입니다 (즉, 실제 논리가 없음).nhibernate 테스트 전략

이것의 가장 큰 단점은 단위 테스트를 어렵게 만들고 데이터베이스가없는 다른 서비스 (예 : sqlite 같은 메모리 내장 DB 없음)가 있는지 궁금합니다. ISession을 조롱하는 것은 나쁜 생각입니까?

아니면 그냥 가상 저장소 클래스를 사용해야합니까?

+0

'데이터베이스없이'요구 사항을 이해하지 못합니다. 서비스 클래스에 다음과 같은 내용이 있다고 가정하십시오 :'Session.Query .Where (u => u.Domain = domain)'. 이 쿼리를 테스트하여 올바른 SQL 및 올바른 결과를 생성하는지 확인 하시겠습니까? 어떻게 그럴 수 있니? –

+0

@sJhonny : 단위 테스트가 아닌 통합 테스트. – jgauffin

답변

0

ISession을 모의하기가 쉬울 수도 있지만 적절한 모의 작업을 수행하는 것이 어려웠습니다. 특히 LINQ 확장 메서드가 사용되는 경우

나는 저장소에 집중할 것이다. ISession과 같은 일반 인터페이스보다 저장소 메소드의 예상 내용을 더 쉽게 이해할 수 있습니다.

0

ISession을 조롱하는 것은 나쁜 생각입니까?

아니요, 좋지 않은 생각입니다. ISession에 의존하는 경우 서비스 클래스를 테스트하기 위해 수행 할 수있는 작업입니다. 비록 당신의 서비스 클래스가 NHibernate에 의존하기 때문에 디자인 냄새가 있지만 당신은 함께 살 수있을 것입니다.

+0

왜 ORM 의존성이 디자인 냄새인지에 대해 자세히 설명해 주시겠습니까? (그들은 WCF 서비스 클래스가 아닙니다) – jgauffin

+0

@jgauffin, 그것은 서비스 계층이 ORM 불가 지론이어야하기 때문입니다. 일부 데이터베이스 또는 ORM (사용하는 경우)에 특정한 DAL 계층입니다. 앞으로 데이터 액세스 전략이나 ORM을 변경하기로 결정하면 서비스 계층을 수정할 필요가 없습니다. 그러나 이것이 당신이 의도하지 않은 것이라면, 내가 말했듯이, 당신은 당신의 서비스 계층에 ISession으로 살 수 있습니다. –

+0

@jgauffin, 당신이 모델을 단순한 원자 연산을 제공하는 저장소 인터페이스를 구현하는 일부 ORM 제공자에 특정한 DAL 계층을 가질 수있는 모든 것을 분리하려는 이상적인 세계에서, 서비스 계층은 생성자로서의 저장소 인터페이스를 사용합니다 인수. –