Ответ Олега замечательный, но позвольте мне предложить перспективу того, кто использует оба варианта.
Светильники были своего рода мальчиком побивания сообщества Rails на некоторое время. Все понимают недостатки светильников, но никто не защищает их сильные стороны. По моему опыту, сами заводы могут легко стать столь же трудными для поддержания, как приспособления (это действительно зависит от схемы, но я отвлекаюсь).Реальная сила фабрик заключается в выборочной замене боли, основанной на креплении. Давайте поговорим о парах особенностей.
Первый выпуск - характеристики. Если вы можете протестировать большую часть своего приложения, не попав в базу данных, вы увидите значительную скорость, но для большинства приложений я не думаю, что было бы разумно протестировать, не попав в базу данных полностью. В какой-то момент вы хотите протестировать весь стек. Каждый раз, когда вы издеваетесь или заглушаете, вы делаете предположение о интерфейсе, который может содержать тонкие ошибки. Итак, предполагая, что вам нужно попасть в базу данных по некоторому значимому проценту тестов, транзакционные светильники (у вас есть с использованием транзакционных светильников вправо?) Вполне может быть намного быстрее, чем создавать экземпляр всей среды для каждого теста.
Я бы сказал, с размером вашего тестового набора, который вам действительно нужно посмотреть в сторону Continuous Integration, чтобы увеличить вашу разработку до следующего уровня. Независимо от того, насколько вы ускоряете их, разработчикам еще долго ждать. Возможно, посмотрите на autotest, а также на индивидуальном уровне. Но в конечном счете CI позволит вам поддерживать тестирование дисциплины, не жертвуя гибкостью разработчика.
Место, где светильники действительно светятся, - это функциональное/интеграционное тестирование. То, как я смотрю на это, - это то, что приборы должны настроить здоровое базовое состояние для тестируемого приложения. Большинство модульных тестов действительно не нужны. Вы можете получить очень хорошее покрытие с использованием фабрик. Однако, когда дело доходит до функционального тестирования, любая страница может поражать десятки моделей. Я не хочу настраивать все эти вещи в каждом тесте. По мере того, как я строил все более сложные сценарии, я все ближе и ближе к воссозданию глобального состояния данных, которое точно, какие светильники были предназначены для работы в первую очередь.
Одно противоречивое убеждение, которое я придерживаюсь, состоит в том, что при прочих равных условиях я предпочитаю один функциональный тест для 20 модульных тестов (с использованием языка Rails). Зачем? Поскольку функциональный тест доказывает, что конечный результат, который отправляется пользователю, является правильным. Модульные тесты отлично подходят для получения нюансов функциональности, но в конце концов вы все равно можете столкнуться с ошибкой по интерфейсу, который разбивает весь ваш сайт. Функциональные тесты - вот что дает мне уверенность в развертывании без фактической загрузки страницы в моем браузере. Я знаю, что я мог бы заглушить все и проверить оба интерфейса и получить одинаковое покрытие, но если я смогу протестировать весь стек за один простой тест за счет небольшого процессора, я бы скорее сделал это.
Итак, каковы мои лучшие практики для светильников?
- Установите несколько для каждой модели, чтобы охватить самые широкие категории данных
- При добавлении важной новой функции, которая разрежет во многих моделях и контроллерах, добавить некоторые новые светильники представляют крупные государства
- Избегайте редактирование старых светильников для добавления/удаления полого
- Используйте заводов для более мелких/более локализованных вариаций
- Используйте заводов для тестирования пагинации или другого массового создания, который необходим только для нескольких тестов, за исключением
Кроме того, позвольте мне рекомендовать Jay Fields' blog для действительно хорошего прагматического совета по тестированию. То, что мне больше всего нравится в блоге Джей, заключается в том, что он всегда признает, что тестирование очень специфично для проекта, и то, что работает для одного проекта, не обязательно работает для другого. Он не знает догмы и долго прагматизма.