YiiFramework Замокировать молель (mock model) используя phpunit

zubans

Новичок
Добрый день, пытаюсь замокировать модель в yii, конкретно нужно замокировать метод findOne, но т.к. он статический, partialMock не подходит, а огород уже нагородил мокируя зависисмости. Неужели нет простого способа замокировать модель?
 

zubans

Новичок
PHP:
$post = $this->getMockBuilder('\app\model\Order')
            ->disableOriginalConstructor()
            ->setMethods(
                [
                    'build',
                    'getQueryBuilder',
                    'getSchema',
                    'getTableSchema',
                    'primaryKey',
                    'findOne',
                    'createCommand',
                    'queryOne',
                    'queryAll',
                ])
            ->getMock();

        $idColumn = (new ColumnSchema());
        $idColumn->name = 'id';

        $numberColumn = (new ColumnSchema());
        $idColumn->name = 'number';

        $tableSchema = $this->createMock(TableSchema::class);
        $tableSchema->name = 'order';
        $tableSchema->fullName = 'order';
        $tableSchema->primaryKey = ['id'];
        $tableSchema->columns = [
            $idColumn,
            $numberColumn
        ];


        $post->method('getSchema')->willReturnSelf();
        $post->method('getQueryBuilder')->willReturnSelf();
        $post->method('build')->willReturn(['one', [':qp0' => "48671"]]);
        $post->method('getTableSchema')->willReturn(
            $this->createMock(TableSchema::class)->name
        );
        $post->method('createCommand')->willReturnSelf();
        $post->method('queryOne')->willReturnSelf();
        $post->method('queryAll')->willReturnSelf();
        $post->primaryKey = 'id';
        $post->columns = ['name'];
        $post->method('findOne')->willReturn('hello');

        return $post;
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
сначала один вопрос: а тебе обязательно выкапывать эту стюардессу, которую написали больше лет 10 назад?
нельзя трахаться с чем-то более свежим?
 

zubans

Новичок
сначала один вопрос: а тебе обязательно выкапывать эту стюардессу, которую написали больше лет 10 назад?
нельзя трахаться с чем-то более свежим?
Вот правда, я не понимаю, про что речь идет, чт онаписали более 10 лет назад. Я использую yii2, phpunit 9.5. Что именно написали более 10 лет назад?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ты на календарь смотрел? yii 2 зарелизили 8 лет назад, а еще год писали, и с того времени не меняли

модуль Active Record написан товарищем Тяном в 2009м, в 2013м Тян всех послал с просьбами нормальной архитектуры, написал "вы должны учиться писать с учетом моих ошибок", сделал Active Record в yii2 точно так же, как yii 1 - со статическими вызовами, нафиг не нужной иерархией наследования вместо композиции, и свалил из проекта в закат, после этого никто ничего серьезного в yii не делал

ты реально откопал стюардессу
 

zubans

Новичок
Ну я прищел на проект. Задача стоит - сделать тесты с моками. Я так понимаю, что ответа у вас на мой вопрос нет
 

WMix

герр M:)ller
Партнер клуба
скажи им, что не подготовленное к тестированию, тестируется не то чтоб долго, чаще бессмысленно
 

Adelf

Administrator
Команда форума
Мокировать активрекорд модели - крайне сложная штука. И это верно, что для yii, что для последнего ларавель. Проблема в том, что необходимо замокать не только отдельные методы, но и всю работу с бд, что выглядит практически нереально.

Единственный вариант - это в коде вынести всю работу с бд в некие аля репозиторий объекты. но это настолько бессмысленно и невыносимо, что проще забить.
 

AmdY

Пью пиво
Команда форума
Это не проблема АР. а проблема реализаций. Сделай авторы все методы протектид и наступило бы светлое будущее.
А данный кейс - это проблема yii, где всё на реальной статике, а не на фасадах как прекрасном Ларавел от святого Тейлора.

В принципе всё решается очень просто, нужно заводить свои базовые класс от которых будут наследоваться модели. Там в любой момент можно переопределить метод и сделать хак для того же статика. Создать костыль для тестов и заменить yii\base\Model на app\base\Model - минутное дело.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Ну я прищел на проект. Задача стоит - сделать тесты с моками. Я так понимаю, что ответа у вас на мой вопрос нет
вот @AmdY написал как - автогенерированные классы вообще не редактируешь, делаешь свои классы со своими методами, которые не наследуются от AR, их покрываешь тестами,
а чтобы в своих классах работать с ActiveRecord без статических вызовов, создаешь "компонент"-фабрику с методами вида getUsersAR(), через который получаешь нужный тебе объект ActiveRecord

P.S. когда написал, посмотрел пример для yii3 https://github.com/yiisoft/active-record 😁 забавно, как мы с Сашей часто одинаково думаем
$user = $arFactory->createAR(User::class);
только в 3ке уже есть автопривязка зависимостей, в 2ке подобную фабрику надо самому из контейнера доставать

именованные фабричные методы типа getUsersAR() лучше, чем обобщенные ->createAR(User::class); - тем, что именованному getUsersAR() можно указать тип возврата, и IDE подхватит автокомплит
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
данный кейс - это проблема yii, где всё на реальной статике, а не на фасадах как прекрасном Ларавел от святого Тейлора.
а решение обычно звучит как "пишите без фасадов" , и возьмите, наконец, Symfony 😁

в Laravel все было зеркально наоборот, но с похожим результатом: если в yii команда отказалась от денег, и продолжали играть со своей прелестью, так ничего за 10 лет и не сделав, то Тейлор наоборот взял денег у инвесторов, занялся маркетингом, переманил к себе индусов, а потом пришли инвесторы, и сказали, хватит играть со своей прелестью, гони выручку - и он занялся бесконечными платными подписными игрушками, ничего серьезного в самом фреймвоке за последние лет 5 не появилось, а рынок отбирают пайтон с нодой
 
Последнее редактирование:

Adelf

Administrator
Команда форума
ничего серьезного в самом фреймвоке за последние лет 5 не появилось, а рынок отбирают пайтон с нодой
Насчет рынка - не знаю. Нет у меня данных. А вот что серьезного могло бы появиться? Я кстати согласен, что фич крутых не появляется, но мне трудно представить какие-нибудь прорывные вещи... Все же есть... что еще надо?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ну как это что - с чего начать-то?
неблокирующие процессы? swoole/amp, в ларавеле нету
распределенные вычисления на шине с управляющим процессом? только драйвер соединения с rabbit, ни решений, ни интеграций
интеграция с облачными провайдерами? заготовки приложений для работы в контейнерах в elastic container service без настройки виртуалок? может, автоматическая настройка http/rest gateway из роутов контроллера? да щас
serverless? step functions? тоже нет, берите ноду, пайтон, golang, java

symfony хотя бы сам php развивает всякими аттрибутами, популяризирует хорошие практики типа autowire с контрактами, а остальные вообще непонятно чем занимаются
 

AmdY

Пью пиво
Команда форума
а решение обычно звучит как "пишите без фасадов" , и возьмите, наконец, Symfony 😁

в Laravel все было зеркально наоборот, но с похожим результатом: если в yii команда отказалась от денег, и продолжали играть со своей прелестью, так ничего за 10 лет и не сделав, то Тейлор наоборот взял денег у инвесторов, занялся маркетингом, переманил к себе индусов, а потом пришли инвесторы, и сказали, хватит играть со своей прелестью, гони выручку - и он занялся бесконечными платными подписными игрушками, ничего серьезного в самом фреймвоке за последние лет 5 не появилось, а рынок отбирают пайтон с нодой
Это фейки. Нормально в Ларавеле тестировать, с фасадами даже удобнее чем Симфони.
Да и нового в Ларке куча появляется:
1. Sail - докер из кородки для чайников
2. Пакеты для авторизации и работы с токенами
3. Обвязка для работы с родранером
4. Компоненты и слоты во вьюхах
5. Нова
и так далее. Есть вопросы по качеству и особенно стилю вроде Fortify, но фреймворк и его экосистема активно развиваются
 
  • Like
Реакции: WMix

grigori

( ͡° ͜ʖ ͡°)
Команда форума
прости, это и есть показатель, что развития фреймвока нет - только пиар и платный сервис

за 5 лет они смогли аж образ для dev-окружения в docker-compose сделать, без swarm, k8s, облаков, пайплайнов сборки?
вообще-то вопрос пары часов

nova - buy a license, в этом вся суть развития фреймвока последние годы

пакеты для авторизации и работы с токенами - да, обвязка для работы с родранером - ну, да, но ... это просто мелкие фичи, все это уже давно было в других реализациях, писать что-то по принципу not invented here - это не развитие
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
мне sail понравился, я под себя много идей взял
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
это ж разные вещи
вспомните, сначала были Symfony 1 и ZF - громоздкие, медленные, многословные, с кучей строковых констант,
для 4ки появляется code igniter с active record и query builder - это было новое, потом kohana с полноценным OOP и автозагрузкой из коробки изменили подход к разработке
потом yii портировал с рельс автогенерацию, и взлетел - разработка админок ускорилась раз в 10
а потом Symfony переписали без связи с первой, и началась современная архитектура - бандлы, DI
потом Laravel придумал прятать громоздкие конструкции за фасадами, соединил с active record - и взлетел
а потом ... laravel не предложил больше ничего

модульность, ядро для микроервисов, autowire, аннотации сделали в symfony,
неблокирующая обработка для микросервисов - amp/react/swoole,
nosql - никто ничего толком не сделал, никаких соглашений, конструкторов запросов,
блокчейн - вообще пусто,
шина, SOA - руками, даже соглашений на сквозной ID запросов по сервисам нет, к примеру
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
laravel не предложил больше ничего
не правда, я понимаю говнистость статика, но возможно это простейший способ придти к сути. компоненты то те же что и симфония. ну доктрина на аналог поменялось, домен то написан не зависимо.
 

AmdY

Пью пиво
Команда форума
прости, это и есть показатель, что развития фреймвока нет - только пиар и платный сервис

за 5 лет они смогли аж образ для dev-окружения в docker-compose сделать, без swarm, k8s, облаков, пайплайнов сборки?
вообще-то вопрос пары часов
Билдят везде по разному, потому никто k8s и т.д. не предлагают. А дев образ из коробки само то, а то все страдают с денвером и оуенсервером в 2022.
Вещи для авторизации и пермишинов из коробки бесплатны. Ещё и бесплатный сервис для пешей завезли недавно. Из коробки удобная работа с css и js фреймворками, завезли недавно nestjs и т.д. Laravel фактически первый популярный фулл стек фреймворк, где и php, и css, и очереди, и токены, и пуш, и социалки, и полнотектовый поиск идут из коробки.

Не знаю, почему ты игнорируешь крутые фичи в ларавел и принижаешь их. Да и StandWithUkraine ребята добавили. Плюс они сбоку пиарят всякие прикольные бесплатные фичи вроде LiveWare или Tailwind. Да, Тейлор делает платные сервисы. Но в отличии от Фабьена делает их на своём фреймворке и завозит в фреймворк нужные для современной разработки фичи, а не академический стиль где долго не могли завести autowire.
 
Сверху