Что такое ObjectMother?

Что такое ObjectMother и какие общие сценарии использования для этого шаблона?

Ответ 1

ObjectMother начинается с шаблона factory путем доставки готовых объектов, готовых к тестированию, с помощью простого вызова метода. Он выходит за пределы области factory на облегчая настройку созданных объектов, предоставление методов для обновления объектов во время испытаний и если необходимо, удаление объекта из базы данных по завершении теста.

Некоторые причины использования ObjectMother:
* Уменьшите дублирование кода в тестах, повысив надежность обслуживания
* Сделать тестовые объекты супер-легкодоступными, побуждая разработчиков писать больше тестов.
* Каждый тест работает со свежими данными.
* Тесты всегда очищаются после себя.

(http://c2.com/cgi/wiki?ObjectMother)

Ответ 3

Как указано в другом месте, ObjectMother - это фабрика для генерации объектов, обычно (исключительно?) для использования в модульных тестах.

Они очень полезны для создания сложных объектов, где данные не имеют особого значения для теста.

Где вы могли создать пустой экземпляр ниже, например,

    Order rubishOrder = new Order("NoPropertiesSet");
    _orderProcessor.Process(rubishOrder);

вы бы использовали разумный из ObjectMother

    Order motherOrder = ObjectMother.SimpleOrder();
    _orderProcessor.Process(motherOrder);

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

Например, если вы добавили некоторую проверку OrderNumber в класс Order выше, вам просто нужно создать экземпляр OrderNumber в классе SimpleObject, чтобы все существующие тесты были пройдены, и вам нужно сосредоточиться на написании тестов проверки.

Если бы вы только что создали экземпляр объекта в тесте, вам нужно было бы добавлять его к каждому тесту (поразительно, как часто я видел, как люди это делают).

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

Другим рекомендуемым поведением является использование хороших описательных имен для ваших методов, чтобы способствовать повторному использованию. Слишком легко получить один объект на тест, чего определенно следует избегать. Лучше создавать объекты, которые представляют общие, а не специфические атрибуты, а затем настраивать их для своего теста. Например, ObjectMother.WealthyCustomer(), а не ObjectMother.CustomerWith1MdollarsSharesInBigPharmaAndDrivesAPorsche() и ObjectMother.CustomerWith1MdollarsSharesInBigPharmaAndDrivesAPorscheAndAFerrari()