Ложное абстрактное поведение класса по умолчанию с 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"свойство просто нулевое.

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

Благодарю.

2 ответа

Решение

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

Таким образом, ответ использует PartialMocks. Я коротко поигрался с генерацией частичного макета, но когда я запустил отладчик поверх него, я заметил, что свойства не были даже нулевыми, они выдавали странные исключения, поэтому я не смотрел намного глубже. Я использовал короткую форму типа 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");
      }
}

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

Попробуйте сделать _params виртуальным

Другие вопросы по тегам