Ложное абстрактное поведение класса по умолчанию с Rhino - PullRequest
3 голосов
/ 07 марта 2009

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

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

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 ]

5 голосов
/ 07 марта 2009

Хорошо, я понял это. Назовите меня как еще одну жертву хитросплетений носорога. Подобные вещи заставляют меня перейти на более простую среду, может быть, я проверю 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");
      }
}

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

0 голосов
/ 07 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...