-- Что вы здесь будете мокать?
А что вы собрались здесь тестировать?
->count() < 2
?
->exists()
?
->one();
if ($phone === null
ну и как вы протестируете, есть в базе такая запись или нет - без базы?
на голых классах?
а что там тестировать, у голых классов то
-- Ну вот зачем мне 300 тестов с БД ждать 60с
а зачем вам 300 тестов которые почти ничего не тестируют
-- Как рефакторить приведённый выше код с ActiveRecord, чтобы он не использовал БД?
ну, если вам хочется писать тесты которые тестируют синтаксис языка программирования, то вынесете все в DTO классы, и тестируйте DTO классы
А потом гидратором забросьте в базу. с помощью пустых ActiveRecord, в конечном коде
-- Если корпоративная система со сложной бизнес-логикой, то удобнее Code-First, DataMapper и тесты.
у нас расчетная система, уровня начисления зарплаты.
как мы обкладываем то тестами расчетную часть без DataMapper...
то что вы привели - точно в DataMapper не нуждается.
почти пустые DTOшки будут.
Ваш пример как раз - прямая рекомендация для легковесной прослойки работы с БД
-- Цель вашего спора-то в чём?
Yii жалко. Хорош он именно благодаря ActiveRocrod
на кой для тьмы малых и средних проектов DataMapper?
Какие там еще 300 тестов, когда пара десятков интеграционных покроют всю ту смешную бизнес-логику что вы привели?
А малые проекты вообще ручным тестированием обходятся.
а энтерпрайза хочется, так берите Symfony. или вообще Джаву или Дотнет
-- но создаёт мешанину и тормозит тесты
не пишите тесты ради тестов.
или тесты тестирующие фреймворк.
и будет вам счастье
И второе
Знаете зачем DataMapper как паттерн появился?
Потому что приложения на Джаве и Дотнете висят в памяти.
У них другой цикл работы, чем у php
Там есть потребность как-то прозрачно синхронизировать объекты в памяти с персистентым хранилищем.
Муторно и ненадежно вручную - читать данные из БД и записывать, отслеживать изменения в памяти, отслеживать изменения в бд и т.п,
А не потому что это какая-то там академически правильная архитектура или скорость выполнения тестов лучше.
Пока же PHP - однопоточный и "рождается чтобы умирать" - DataMapper для проектов на нем - подслеповатое копирование решений из систем где есть проблема, в системы где такой проблемы вообще нет.
А вот если запущен PHP под каким-нить swoole, я первый скажу, о, надо DataMapper брать.
И, из той книжицы, что с хабра собрана, видно, что обычно число интеграционных тестов ощутимо превышает число юнит тестов.
Потому что юнит тесты мало что тестируют.
А нужны для того чтобы можно было рефакторить код в огромных командах, в проектах которые точно проживут больше 5 лет.
Юнит тесты же в php исходя из этого - чаще карго культ, чем практическая необходимость.