우리는 ASP.NET MVC 사이트를 구축하고 있으며, 단위 테스트를 가장 효과적으로 사용할 수있는 연결을 정의하는 데 어려움을 겪고 있습니다 (저는 '연결'을 일반적으로 사용합니다 - 세션, 연결, 어댑터 또는 트랜잭션 및 데이터베이스 작업을 관리 할 수있는 다른 유형의 데이터 컨텍스트). 우리는 UserService의 방법 내에서 이런 일을 할 거라고 과거MVC에서 데이터 컨텍스트 (어댑터, 연결, 세션 등)를 인스턴스화 할 위치는 어디입니까?
UserController
UserService
UserRepository
:
의 우리가 3 개 클래스 있다고 가정 해 봅시다 그러나
Using (ISomeSession session = new SomeSession())
{
session.StartTransaction();
IUserRepository rep = new UserRepository(session);
rep.DoSomething();
rep.Save();
session.Commit();
}
을, 정말 아니었다 SomeSession에 대한 의존성이 주입되지 않았으므로 단위 테스트가 가능합니다. 그러나, 우리가 D.I. UserService에 종속성을 주입하려면 UserService의 수명 동안 세션이 중단됩니다. UserController에서 호출 된 여러 서비스가있는 경우 각각의 세션은 UserController가 가비지 수집 될 때까지 매달려있을 수 있습니다.
더 나은 관리 방법에 대한 의견이 있으십니까? 나는 명백한 것을 놓치고 있는가?
편집
미안 분명하지 않다 경우 - 내가 세션/데이터 컨텍스트와 의존성 삽입 (Dependency Injection)을 사용할 수 있음을 이해하지만, 다음은 서비스 클래스의 수명 동안 유지되고 있어요. 실행 시간이 오래 걸리는 작업/메소드 (예 : 일괄 처리로 서비스를 호출한다고 가정 해 보겠습니다)의 경우 테스트 가능성을 추가하는 것 외에 다른 이유로 열린 세션이 많이 발생할 수 있습니다.
실제 연결로 테스트하는 경우 단원 테스트가 아니라 통합 테스트입니다. – RichardOD
Richard - 이해합니다.내 요점은 클래스의 수명 내내 연결 유지 (또는 최소한 컨텍스트 활성화)를 유지하지 않고 종속성을 클래스 수준으로 이동하는 방법을 알지 못했기 때문에 Using 문에서 약간의 시간 동안 . "Using"블록은 필요할 때 연결을 열고 완료되면 닫히기 때문에 훨씬 안전 해 보입니다. –