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