2009-03-06 5 views
3

저는 조롱하기가 매우 쉽습니다. 그래서 이것은 아직 익숙하지 않은 것일 수도 있지만, 어디서나 좋은 예를 찾을 수는 없습니다.Rhino에서 추상 클래스의 기본 동작 모의

기본적으로 내 추상 클래스에서 상속하는 모든 클래스는 생성자에서 컬렉션을 인스턴스화합니다. 다음은 추상 클래스입니다.

public abstract class DataCollectionWorkflow : SequentialWorkflowActivity 
{ 
     private readonly DataSet _output = new DataSet(); 
     private List<DataCollectionParameter> _params = null; 

     public DataCollectionWorkflow() 
     { 
      _params = new List<DataCollectionParameter>(); 
     } 

     public virtual IList<DataCollectionParameter> Parameters 
     { 
      get { return _params; } 
      set { _params = (List<DataCollectionParameter>)value; } 
     } 
} 

Rhino를 어떻게 조롱합니까? GenerateMock<DataCollectionWorkflow> (또는 스텁)을 실행하면 생성자가 실행되고 모의의 비공개 필드 인 "_params"이 초기화되지만 모의의 "Parameters"속성은 단순히 null입니다.

분명히 생성 된 mock 하위 클래스가 속성 구현을 재정의하고 있습니다. 매개 변수 속성을 다시 구현하지 못하게하는 방법이 있습니까?

감사합니다.

답변

5

알았어, 알아 냈어. Rhino의 복잡함에 또 다른 희생자가 될 수 있습니다. 이런 종류의 일은 내가 더 간단한 프레임 워크로 이동하기를 원할 것입니다. 아마 MoQ를 체크 아웃 할 것입니다.

그래서 PartialMocks를 사용하고 있습니다. 나는 부분적으로 모의 객체를 생성하는 것으로 잠시 동안 놀았지만, 디버거를 실행했을 때 속성이 null이 아니라는 사실을 알았고, 이상한 예외를 던져 버렸기 때문에 훨씬 더 깊게 보지 않았다. 짧은 형식의 AAA 유형의 구문을 사용하고있었습니다.

단순히 모의를 재생 모드로 설정하면 테스트가 작동합니다. 속성은 그대로 사용됩니다 (일부 모의 함께 사용해야 함).

그래서 여기에 대답 :

[Test] 
public void ShouldCreateParameterListInConstructor() 
{ 
     var mockRepository = new MockRepository(); 
     var mock = mockRepository.PartialMock<DataCollectionWorkflow>(); 
     using (mockRepository.Record()) 
     { 

     } 
     using (mockRepository.Playback()) 
     { 
      Assert.That(mock.Parameters, Is.Not.Null, "DataCollectionWorkflow base class didn't create new param collection"); 
     } 
} 

나는 이것이 상태 테스트입니다 것을 깨닫게하지만 실제로 문제의 속성을 포함 몇 가지 행동 테스트에 대한 간단한 서곡, 그래서 나는 전제 조건으로이 사건을 원했다. 누군가가 도움이되기를 바랍니다.

0

_params 가상 만들기 시도

+0

필드는 가상 일 수 없습니다. 문제는 매개 변수 속성이 필드가 아닌 재정의됩니다. 필드가 잘 초기화되어 ... 더 이상 모의 객체의 속성에 연결되지 않습니다. – womp