Список фиктивных (Moq) объектов — лучшие практики/упрощение

Рассмотрим следующее:

new SUT(null, null, new List<IObjectBeingMocked>() { mockObjectOne.Object, mockObjectTwo.Object })

Моей SUT (тестируемой системе) нужен список объектов в качестве третьего параметра. Это должны быть макеты, так как я возложил на них некоторые ожидания.

Как мне это очистить, чтобы избавиться от необходимости вызывать .Object для каждого элемента в списке? Обычно есть только два пункта, но их может быть больше, и, на мой взгляд, это затрудняет чтение теста.

Каков был бы лучший способ легко/красиво преобразовать этот список фиктивных объектов в реальные объекты?


person Finglas    schedule 15.09.2009    source источник


Ответы (4)


Вы можете использовать метод Mocks.Query(), который вернет коллекцию всех фиктивных экземпляров SUT.
Эта функция существует в бета-версии moq. Подробнее см. здесь:

person Ohad Horesh    schedule 16.09.2009
comment
Это правда, поэтому я принял его, но моя версия Moq не поддерживает его, поскольку я не использую бета-версию. Это то, на что я посмотрю. - person Finglas; 17.09.2009

Возможно, вы могли бы использовать методы расширения для управления созданием списка и вызовом свойства Object.

var list = new List<Mock<Foo>>() { ... };
new SUT( null, null, list.Select( o => o.Object ).ToList() );
person tvanfosson    schedule 15.09.2009

Хороший способ справиться с этим — создать метод GetSUT(), который создает его только один раз в одном месте. Затем, когда ваше создание SUT изменится, вам нужно будет изменить его только в одном месте.

person Chris Missal    schedule 16.09.2009

Вы можете ввести объясняющие переменные (локальные переменные) для ясности:

IObjectBeingMocked objectOne = mockObjectOne.Object;
IObjectBeingMocked objectTwo = mockObjectTwo.Object;

new SUT(null, null, new List<IObjectBeingMocked>() { objectOne, objectTwo });

РЕДАКТИРОВАТЬ: Возможно, с более удачными именами, чем мои «objectOne», «objectTwo». ;)

person TrueWill    schedule 16.09.2009