Тестирование моделей и сервисов с Laravel, PHPSpec и PHPUnit

У меня трудности с выбором или пониманием лучшего подхода к тестированию в Laravel.

Мне действительно нравится поведенческая сторона тестирования PHPSpec, хотя она просто не совместима с тестированием моделей Eloquent или чего-либо, связанного с активной записью ORM.

При тестировании таких вещей, как поставщики услуг, PHPSpec кажется, что путь.

** Желательно ли тестировать модели с чем-то вроде PHPUnit, а затем тестировать другие уровни, отличные от ORM, такие как поставщики услуг, с чем-то вроде PHPSpec? ***

1

Решение

Я не знаю Laravel, но проблемы с чтением, которые возникают у людей с модульным тестированием, говорят мне, что там много проблем с дизайном. Я понял, что эти проблемные функции Laravel не обязательны, так что есть надежда!

Посмотрите мое сравнение PhpSpec и PhpUnit в ответе на другой вопрос: Первый выстрел при тестировании приложений Laravel 4 (PHPSpec / BDD vs. PHPUnit / TDD)

Я предполагаю, что вы столкнетесь с множеством проблем при использовании PhpSpec с Laravel, и часто вам придется избегать задавать специфические особенности Laravel или избегать их (фасады необязательны, вы можете использовать правильное внедрение зависимостей). Я хотел бы иметь как можно больше кода, независимого от фреймворка, и правильно их тестировать. Затем вы можете получить тонкий слой связующего кода фреймворка, покрытого функциональными или интеграционными тестами. Примените инъекцию зависимости.

В качестве примера, взятого из страны Symfony и Doctrine, я обычно не пишу спецификации для хранилищ Doctrine. Ну, я только ожидаю, что они реализуют определенный интерфейс. Это все. Остальное покрыто моими приемочными испытаниями. Нет особого смысла в проверке того, что хранилища используют построитель запросов для создания ожидаемого запроса. Нет смысла на самом деле.

Возвращаясь к инструментам, я вижу, как смешиваю различные виды инструментов тестирования для разных видов тестирования:

  • phpspec — юнит-тесты — я напишу большинство тестов на этом уровне
  • беат — приемочные испытания
  • phpunit — интеграционные и функциональные тесты — у меня их будет немного, так как они хрупкие и медленные.
5

Другие решения

Это на самом деле имеет мало общего с Laravel и на самом деле является фундаментальной проблемой ActiveRecord как шаблона. Когда вы используете ActiveRecord, вы жертвуете тестируемостью. ActiveRecord неразрывно связан с постоянством базы данных.

Если вы хотите использовать тестовый подход, я рекомендую использовать другой подход к постоянству. Напишите ваши объекты, чтобы функционировать вместе. Затем приложите настойчивость позже с помощью чего-то вроде Учения.

Если вы все равно хотите использовать ActiveRecord, вам нужно будет сделать что-то немного другое. Laravel не заставляет использовать Eloquent. Но он поставляется с ним из коробки. ActiveRecord — это инструмент, более или менее подходящий для написания CRUD-приложений. Если вы делаете что-то более сложное, я бы предложил Doctrine.

3

По вопросам рекламы [email protected]