2011-10-20 2 views
1

그래서 저는 조롱하는 데 익숙해졌습니다. 이 클래스에Rhino Mock을 사용하여 개인 객체를 모의합니다.

private CoreDataContext _coreDataManager; 

: : 여기이 개인 변수가

public class RatesControlReport 
     : Chatham.Panda.Batch.ProcessDefinition.BatchProcess 

이 클래스는 내가 CheckSwaptionVols(DateTime runDate)라는 테스트 할 그것에 void 방법이있다.

내 테스트의 첫 부분에서 나는 메인 클래스의 인스턴스를 할 수 있습니다

RatesControlReport ratesControlReportProcess; 
      ratesControlReportProcess = new RatesControlReport(); 

그리고 기본적으로 내가이 호출을 만들고 싶어 :

ratesControlReportProcess.CheckSwaptionVols(DateTime.Now); 

그러나이 방법과 같이 민간 변수를 사용을 :

System.Data.Linq.ISingleResult<CheckSwaptionVols> swaptionStatusResult = _coreDataManager.CheckSwaptionVols(this._runDate); 

대신이 변수의 조롱 된 버전을 전달하고 싶습니다. 내 자신의 지정 System.Data.Linq.ISingleResult<CheckSwaptionVols>을 돌려서 DB에 의존하지 않고 테스트를 계속할 수 있도록하십시오.

어떻게하면됩니까?

답변

5

글쎄, 그것은 당신이 당신의 CoreDataContext를 어디서 인스턴스화 하느냐에 달려 있습니다. 이것이 정적 컨텍스트 또는 생성자에서 생성 된 경우 실제 모의 객체를 생성 할 수있는 방법은 없습니다. 따라서 일반적으로 객체 내부의 종속성을 인스턴스화하는 것은 좋지 않은 방법입니다. 의존성 주입에 대한 몇 가지 방법을 제공하면됩니다. 그러나, 에 모범 사례로 간주됩니다,

일반적으로
internal void InjectContext(CoreDataContext context) 
{ 
    _coreDataManager = context; 
} 

말하기 :

public RatesControlReport(CoreDataContext context) 
{ 
    _coreDataManager = context; 
} 

... 또는 당신이 필사적 인 경우에도 내부 방법이 오버로드 된 생성자처럼 간단 할 수있다 RatesControlReport를 구성 할 때 항상에 CodeDataContext 개체를 제공하십시오. 이렇게하면 데이터 액세스가 비즈니스 로직에서 분리되므로 두 클래스를보다 효과적으로 단위 테스트 할 수 있습니다.

+0

+1 동의. 생성자에 객체를 전달하지 않으면 단위 테스트를 설정하는 "엉덩이의 고통"이 발생합니다. 또는 더 나쁜 것은 단위 테스트를 포기하는 것이 너무 번거롭기 때문입니다. –

관련 문제