2009-03-06 8 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> (или заглушку), конструктор запускается, и частное поле mock «_params» инициализируется, но свойство «Parameters» макета просто равно нулю.

Очевидно, сгенерированный макетный подкласс переопределяет реализацию свойства. Есть ли способ исключить свойство Parameters из-за повторной реализации?

Спасибо.

ответ

5

Хорошо, я понял. Отбросьте меня в качестве еще одной жертвы для тонкостей Rhino. Подобная вещь заставляет меня хотеть перейти к более простой структуре, может быть, я проверю MoQ.

Таким образом, ответ использует PartialMocks. Я коротко сыграл с генерированием частичного макета, но когда я запустил отладчик, я заметил, что свойства не были даже нулевыми, они бросали странные исключения, поэтому я не выглядел намного глубже. Я использовал синтаксис типа AAA с коротким форматом.

Оказывается, если я просто помещаю mock в режим воспроизведения, тест работает - свойства используются как есть (как и должно быть с частичным макетом).

Так вот ответ:

[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"); 
     } 
} 

Я понимаю, что это Stateful тест, но это на самом деле проще прелюдия к некоторому поведенческому тестированию, что включает в себя собственность на вопросе, так что я хотел, чтобы этот случай в качестве предварительного условия. Надеюсь, это поможет кому-то.

0

Попробуйте создать _params virtual

+0

Поля не могут быть виртуальными. Проблема в том, что свойство Parameters переопределяется, а не поле. Поле инициализировано просто отлично ... оно больше не связано с свойством в макете. – womp

 Смежные вопросы

  • Нет связанных вопросов^_^