Макет поведения абстрактного класса по умолчанию с Rhino

StackOverflow https://stackoverflow.com/questions/620894

Вопрос

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

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

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 из повторной реализации?

Спасибо.

Это было полезно?

Решение

Ладно, я с этим разобрался.Запишите меня как еще одну жертву хитросплетений Rhino.Такого рода вещи заставляют меня захотеть перейти на более простую структуру, возможно, я проверю 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 виртуальными

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top