Юра
Будут три виртуальные роута и один внутренний реальный контроллер
Виктор
А какие юз кейсы будут
Вот ты получил сущность альбом. Запросил у неё комментарии (просто дёрнул поле) и упал по памяти, потому что комментов миллион
Похоже, криво сформулировал. У меня уже есть сущность Comment (абстрактный класс), от которого наследуют Album/Photo/TextComment - комментарии для соответствующих сущностей альбома/фото/статьи. Разница между ними только в типе свойства Parent - всё остальное в абстрактном классе. Например:
php
class AlbumComment extends Comment
{
#[ORM\ManyToOne(inversedBy: 'comments')]
#[ORM\JoinColumn(nullable: false)]
private ?Album $parent = null;
public function getParent(): ?Album
{
return $this->parent;
}
public function setParent(?Album $parent): static
{
$this->parent = $parent;
return $this;
}
}
Комментарии связаны со своими сущностями ManyToOne, как можно видеть. Выводятся они, соответственно, тривиально. Есть общий шаблон комментария, есть также общий шаблон формы для отправки комментария.
Виктор
Или тебе нужно будет только вставлять коммент и удалять? А для того, что бы получить последние сущность не нужна?
Проблема у меня с отправкой/редактированием/удалением комментариев. У альбома/фото/статьи комментарии - это ведь фактически разные сущности. Соответственно в этих действиях создаются разные классы, редирект после обработки запроса делается на разные роуты и т.п. Вот для альбомов я это написал. А как теперь воткнуть это в контроллеры фото и статьи? Не копировать же код и заменять? Короче, проблема не в реализации. Думаю, что в моём недостатке знаний паттернов/практик. Короче как сделать понимаю, а как сделать грамотно - нет. Вот, хотел узнать.
Юра
А можно совместить оба варианта
Юра
Но судя по твоему вопросу у тебя логика в контроллере, что как бы не очень хорошо, так как по сути контроллер это просто один из инпутов твоего приложения
Юра
Как только ты вынесешь логику в сервисы, то увидишь что все можно тестировать юнит тестами и это очень удобно и главное быстро и не требует кернела
Павел
Юра
Боль когда у тебя 2000 тестов и все они выполняются пол часа, а потом ещё джс тесты которые ещё пол часа выполняются
Юра
Поэтому я предпочитаю юнит тесты
Alexey Mishurovskiy
Юра
Это мега боль
Юра
Или нужно срочно хотфикс сделать а ты ждёшь пайплайн час
Павел
Alexey Mishurovskiy
Юра
Или когда ты наконец дождался но кто-то уже смерджил в мастер и тебе нужно сделать рибейс и все сначала )
Юра
Я не знаю точное количество тестов у нас но они реально минут двадцать выполняются
Павел
Поэтому я предпочитаю юнит тесты
Я не говорю про то что юниты не нужны, я говорю о том что
{
$entity= $this->repository->get()
$this->calculator->action($entity)
$this->em->flush()
}
Нечего именно тут юнитами тестировать
Павел
Бессмысленность тестирования белого ящика с кучей моков и почти 0 пользы
Павел
Что мы тут проверим? Что вызвался репозиторий, за ним калькулятор а за ним флаш? И что нам дает этот тест кроме хрупкости?
Павел
Профитней один тест на контроллер или на сервис но с БД, чтобы знать что у нас 200 а не 500.
Павел
А уже на калькулятор навесить юнитов
Павел
ТАк мы проверим что и БД впоряде, и система ок, и простые юниты с минимальным кол-вом моков. Основная проблема тестов - это их подготовка и поддержка. И чем сложнее тот или иной фактор, тем дольше их писать, тем чаще они забиваются, тем медленее идет разработка основных фич
The Ant
Dmitriy
тесты эндпоинтов и паратест в помощь
Dmitriy
моки это ад
Павел
Но с Юрием я тоже согласен, время тестов не надо исключать из факторов. Написать кучу мало полезных, но долгих тестов, которые ходят в БД, а потом ждать долгие ci - плохо и замедляет разработку.
Павел
Ну хотябы то, что
1) ты правильным способом забрал энтити
2) ты точно вызвал экшон
3) ты точно вызвал flush
Функциональный тест на ту же логику будет работать только если ты правильно его напишешь.
Допустим мы забыли вызвать flush. Какие проверки это не покажут:
a) проверка только респонса, так как сущность поменялась в памяти но не применилась к бд, но при этом смапилась в респонс
b) проверка по фикстурам, так как не будет реального запроса в бд, вы просто достанете по памяти из identity map измененную сущность.
Это дублирование логики кода в тесте. Хрупкость теста, белый ящик. Сложный хрупкий тест на моках, не вижу смысла.
Флаша может и вообще не быть, он будет например в мидлваре или еще где.
Я считаю что надо минимум тестов, с минимум сложностей которые покроют максмум кейсов , а не 100% покрытие тестов и тестирования всего и вся. Это всё надо писать поддерживать, это всё $
Павел
Т.е. писать тест на то, что кто то удалил флаш в ходе разработки, я считаю излишество.
Павел
Опять же можно проверить апи или бд и в ходе интегнрационного теста, что операция была выполнена
Михаил
Ну вы можете бесконечно придумывать условия благодаря которым вот подобные тесты не нужны.
Павел
Павел
Михаил
Сэкономьте себе время, вынесете комбинаторику и кучу неудобных проверок в юниты и не проверяйте это функциональными
Павел
Михаил
Они не хрупкие? У вас функциональные или интеграционные тесты связывают десятки или сотни классов. Это десятки или сотни причин для изменения.
Вы пишите функциональные тесты без моков и фикстур? Реальные запросы чтоль в s3 там отправляете?
Павел
Павел
Павел
Вы просто не видите что я пишу и о чем я пишу,
Павел
Павел
Вот я писал как тестить комбинаторику
Павел
Хочу говорить, не хочу слушать - об этом я и говорю про вас.
Я же не спорю с вами, я с вами солидрен. Что комбинаторику надо тестить юнитами без моков, с отсуствием зависимости по максимуму
Павел
Поэтому я не понимаю, что вы мне пытаетесь рассказать, если я с вами не спорю и согласен
Павел
Чистые классы и функции с минимум зависимостей для сложной логики и юнит тестов
Павел
Много зависимостей и минимум логики - интеграционные
Михаил
Павел
Михаил
А ну и насчёт скорости.
1 юнит тест гораздо быстрее чем функциональный с бд
Михаил
И вот у вас есть логика
Вы не написали тест
Дальше кто-то добавил if и тест это не покажет
Михаил
Ураааа
Михаил
Мы закончили эту духомотину
Павел
Павел
борьба сама с собой)))
Павел
Беседа уже была закончена и вы в ней не участвовали, но решили продолжить
Михаил
А вы хотите ограничить меня в высказывании своего мнения? Конечно же так всегда проще оставаться правым, когда остальные молчат
Павел
Михаил
Юра
Та вы просто спорите что лучше интеграционные тесты или юнит тесты
Павел
Юра
Что лучше яблоки или арбузы
Павел
Павел
По мне юнитами тестировать апликейшен сервисы лишняя работа с большой морокой в виде моков и с минимум профита. Но если вам там лучше и хотите максимальное покрытие - ок, ваше право.
Павел
Т.е. по мне лучше сделать 20 % возможных тестов, чтобы сделать 80 % полезности, и не добивать потом еще 80% тестов, чтобы покрыть оставшиеся 20%.
Но опять же это имхо.
Михаил
На самом деле нет, я даже не понимаю о чем мы спорим
Напомню, начали вот про этот ваш монолог. Дальше шло что-то про дублирование, я говорил что это не дублирование ну и так далее. А потом выяснилось что каждый останется при своём мнении, хотя если вы и не хотели это обсуждать то могли бы начать с этой фразы.
Павел
Павел
Сделать 3 мока, чтобы проверить что они вызывались последовательно. Не вижу смысла.
Если видите - ок
Михаил
Ну вот поэтому я и ворвался, так как это была провокационная фраза, а я падок на провокации.