Макет поведения абстрактного класса по умолчанию с Rhino
-
05-07-2019 - |
Вопрос
Я довольно новичок в издевательствах, так что, возможно, это то, чего я просто пока не понимаю, но я нигде не могу найти хорошего примера.
Я пытаюсь утверждать, что по умолчанию любой класс, который наследуется от моего абстрактного класса, создаст экземпляр коллекции в конструкторе.Вот абстрактный класс:
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 виртуальными