У меня трудности с выбором или пониманием лучшего подхода к тестированию в Laravel.
Мне действительно нравится поведенческая сторона тестирования PHPSpec, хотя она просто не совместима с тестированием моделей Eloquent или чего-либо, связанного с активной записью ORM.
При тестировании таких вещей, как поставщики услуг, PHPSpec кажется, что путь.
** Желательно ли тестировать модели с чем-то вроде PHPUnit, а затем тестировать другие уровни, отличные от ORM, такие как поставщики услуг, с чем-то вроде PHPSpec? ***
Я не знаю Laravel, но проблемы с чтением, которые возникают у людей с модульным тестированием, говорят мне, что там много проблем с дизайном. Я понял, что эти проблемные функции Laravel не обязательны, так что есть надежда!
Посмотрите мое сравнение PhpSpec и PhpUnit в ответе на другой вопрос: Первый выстрел при тестировании приложений Laravel 4 (PHPSpec / BDD vs. PHPUnit / TDD)
Я предполагаю, что вы столкнетесь с множеством проблем при использовании PhpSpec с Laravel, и часто вам придется избегать задавать специфические особенности Laravel или избегать их (фасады необязательны, вы можете использовать правильное внедрение зависимостей). Я хотел бы иметь как можно больше кода, независимого от фреймворка, и правильно их тестировать. Затем вы можете получить тонкий слой связующего кода фреймворка, покрытого функциональными или интеграционными тестами. Примените инъекцию зависимости.
В качестве примера, взятого из страны Symfony и Doctrine, я обычно не пишу спецификации для хранилищ Doctrine. Ну, я только ожидаю, что они реализуют определенный интерфейс. Это все. Остальное покрыто моими приемочными испытаниями. Нет особого смысла в проверке того, что хранилища используют построитель запросов для создания ожидаемого запроса. Нет смысла на самом деле.
Возвращаясь к инструментам, я вижу, как смешиваю различные виды инструментов тестирования для разных видов тестирования:
Это на самом деле имеет мало общего с Laravel и на самом деле является фундаментальной проблемой ActiveRecord как шаблона. Когда вы используете ActiveRecord, вы жертвуете тестируемостью. ActiveRecord неразрывно связан с постоянством базы данных.
Если вы хотите использовать тестовый подход, я рекомендую использовать другой подход к постоянству. Напишите ваши объекты, чтобы функционировать вместе. Затем приложите настойчивость позже с помощью чего-то вроде Учения.
Если вы все равно хотите использовать ActiveRecord, вам нужно будет сделать что-то немного другое. Laravel не заставляет использовать Eloquent. Но он поставляется с ним из коробки. ActiveRecord — это инструмент, более или менее подходящий для написания CRUD-приложений. Если вы делаете что-то более сложное, я бы предложил Doctrine.