Alexey
если денег много да
Alexey
ботов действительно можно писать слабосвязанно и относительно легко тестить
Alexey
сложные апи нет 😞
Dmitriy
почему ? не вижу причин для этого
Dmitriy
все можно слабосвязанно написать было бы желание и руки
Alexey
ну вот из практики
Dmitriy
давай пример где нельзя
Alexey
есть генератор отчетов, который делает группировку произвольного уровня сложности из elasticsearch
Alexey
мокать ответ сервера ты будешь примерно вечность
Dmitriy
я мокать буду сервисы
Dmitriy
и их в начале тестировать
Alexey
потому что есть очень много композиций и вариантов группировки
Alexey
ну вот у тебя есть сервис - генератор отчетов
Dmitriy
из-за этого тестировать буду сервисы. что бы я уверен что 1+1 = 2
Alexey
он зависит от сервиса - соединения с эластиксерчем
Alexey
зачем его мокать? если есть и тестовая база, и фикстуры?
Dmitriy
ну в начале покрою юнит тестами.
Dmitriy
а потом уже возьмусь другие
Alexey
а зачем? 😊
Dmitriy
а ты уверен что из 100500 вариантов генерации отчета он будет правильно 100500 раз ?
Dmitriy
как раз юнит тесты частично решают проблему
Alexey
ну вот в этом и мякотка
Alexey
что можно в функциональном тесте эти варианты сразу описать
Dmitriy
интеграционный тест тут такое себе . на одних данных он проверит а на других ? или вы на всех вариантов проверяете ?
Alexey
у тебя будут тонкие контроллеры и сервис будет протестирован
Dmitriy
ты же не тестируешь сервис. а тестируешь эндпоинт
Alexey
так эндпойнт по сути это фасад для сервиса
Alexey
для работоспособности приложения необходимо и достаточно чтобы эндпойнт был рабочим
Dmitriy
на данный внутри плевать ? =)
Alexey
мы ведь для того и отделяем бл в сервис? чтоб скрыть реализацию и оставить снаружи простой интерфейс
Niko
проще на голанге переписать за некоторое небольшое время
мне гошники говорили, что это может быть и не лучше
Alexey
:D
Alexey
на данный внутри плевать ? =)
может быть ты и приватные методы тестируешь? :D
Dmitriy
нет.
Dmitriy
но у тебя там не один класс
Dmitriy
а 100500 еще есть, я надеюсь
Alexey
100500
Dmitriy
ну вот там наверняка еще 100500 паблик методов
Dmitriy
я про эти данные
Alexey
но внешний интерфейс-то у сервиса обычно один или несколько
Alexey
генератору отчета по сути надо только генерацию и запустить
Alexey
и дать результат
Dmitriy
а потом мы изменим 1+2 = 4 и в 1% ответа будут приходить не правильные данные. на хабре был похожий случай, когда что-то там не работало во вторник
Dmitriy
эти баги не отловить если тестировать сам ендпоинт
Dmitriy
хм . а как ты поймешь где бага ? вот у юзера это сработало во вторник. а ты проверяешь в среду
Alexey
можно мокать же текущую дату
Alexey
в том же карбоне есть setTestNow()
Dmitriy
ну в среду тесты погоняешь и там все хорошо. как додуматься до вторника ? =)
Alexey
это все нюансы (:
The Ant
Давайте я вам гавнеца подкину? ;D
The Ant
https://pastebin.com/CfSbaKjb
The Ant
у меня пять таких однотипных экшенов :D
The Ant
куда спрятать эту ебаную логику? )
Дмитрий
Нам своего хватает
The Ant
:D
The Ant
я реально устал уже думать )
The Ant
шо так гавно шо эдак, сотановился на этом
Alexey
return [ 'error' => [ 'code' => 1, 'message' => implode('<br>', $video->getErrorSummary()), ], ];
Alexey
как печаль
Alexey
как минимум надо обертку над респонсом сделать чтоб ошибки ловить
Alexey
посмотреть как сериалайзер обрабатывает модели с ошибкой 😊
The Ant
Alexey
нихуя не понял, пропустим этот момент ;D
если валидация не прошла можно сделать return $model;
Alexey
посмотри yii\rest\UpdateAction
The Ant
это как-то неправильно
The Ant
должен же респонс возвращаться вообще
Dmitriy
куда спрятать эту ебаную логику? )
if (Yii::$app->user->can('videos.changeCategories')) { $this->caterory->change($new, $old); }
The Ant
if (Yii::$app->user->can('videos.changeCategories')) { $this->caterory->change($new, $old); }
там иды передаются? а внутри типа логика? и этот метод в AR модели Category?
The Ant
или как
Dmitriy
все с 39 стороки пряч нафиг.
The Ant
изначально я вообще думало использовать метод populateRelation http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#populateRelation()-detail Т.е. закинуть туда новые категории, потом каким-нибудь евентом(которого нет) отследить изменение и применить изменения при сохранении
The Ant
вот щас чо делать... пилить эту логику в AR моделях? :(
Dmitriy
вынеси это куда-то с контроллера для начала
The Ant
куда? вот вопрос
Dmitriy
в отдельный класс
The Ant