Юра
Будут три виртуальные роута и один внутренний реальный контроллер
Виктор
А какие юз кейсы будут Вот ты получил сущность альбом. Запросил у неё комментарии (просто дёрнул поле) и упал по памяти, потому что комментов миллион
Похоже, криво сформулировал. У меня уже есть сущность 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, как можно видеть. Выводятся они, соответственно, тривиально. Есть общий шаблон комментария, есть также общий шаблон формы для отправки комментария.
Виктор
Или тебе нужно будет только вставлять коммент и удалять? А для того, что бы получить последние сущность не нужна?
Проблема у меня с отправкой/редактированием/удалением комментариев. У альбома/фото/статьи комментарии - это ведь фактически разные сущности. Соответственно в этих действиях создаются разные классы, редирект после обработки запроса делается на разные роуты и т.п. Вот для альбомов я это написал. А как теперь воткнуть это в контроллеры фото и статьи? Не копировать же код и заменять? Короче, проблема не в реализации. Думаю, что в моём недостатке знаний паттернов/практик. Короче как сделать понимаю, а как сделать грамотно - нет. Вот, хотел узнать.
Виктор
Будут три виртуальные роута и один внутренний реальный контроллер
То есть я делаю контроллер типа CommentController, и в нём обрабатываю логику отправки/редактирования/удаления? И соответственно все действия с комментариями (кроме отображения в альбомах/фото/текстах) будут выполняться этим контроллером?
Юра
То есть я делаю контроллер типа CommentController, и в нём обрабатываю логику отправки/редактирования/удаления? И соответственно все действия с комментариями (кроме отображения в альбомах/фото/текстах) будут выполняться этим контроллером?
Ну все зависит от архитектуры приложения. Если у тебя точка входа логики контролёр, то да, как я выше написал. Если же контролёр это просто точка входа хттп формата и дальше он редиректит логику в сервис, то можно и три разных контроллера но один сервис
Юра
А можно совместить оба варианта
Юра
Но судя по твоему вопросу у тебя логика в контроллере, что как бы не очень хорошо, так как по сути контроллер это просто один из инпутов твоего приложения
Юра
Как только ты вынесешь логику в сервисы, то увидишь что все можно тестировать юнит тестами и это очень удобно и главное быстро и не требует кернела
Павел
Как только ты вынесешь логику в сервисы, то увидишь что все можно тестировать юнит тестами и это очень удобно и главное быстро и не требует кернела
Юнит тесты апликейшен сервисов с кучей моков бесполезность и боль. А именно они инжектятся в контроллер
Юра
Боль когда у тебя 2000 тестов и все они выполняются пол часа, а потом ещё джс тесты которые ещё пол часа выполняются
Юра
Поэтому я предпочитаю юнит тесты
Alexey Mishurovskiy
Боль когда у тебя 2000 тестов и все они выполняются пол часа, а потом ещё джс тесты которые ещё пол часа выполняются
Боль это когда после этого выкатываешь в прод и кладёшь его на пару часов, потому что тесты не поймали баг 😂
Юра
Это мега боль
Юра
Или нужно срочно хотфикс сделать а ты ждёшь пайплайн час
Alexey Mishurovskiy
Юра
Или когда ты наконец дождался но кто-то уже смерджил в мастер и тебе нужно сделать рибейс и все сначала )
Юра
36 секунд)
Я не знаю точное количество тестов у нас но они реально минут двадцать выполняются
Павел
Поэтому я предпочитаю юнит тесты
Я не говорю про то что юниты не нужны, я говорю о том что { $entity= $this->repository->get() $this->calculator->action($entity) $this->em->flush() } Нечего именно тут юнитами тестировать
Павел
Бессмысленность тестирования белого ящика с кучей моков и почти 0 пользы
Павел
Что мы тут проверим? Что вызвался репозиторий, за ним калькулятор а за ним флаш? И что нам дает этот тест кроме хрупкости?
Павел
Профитней один тест на контроллер или на сервис но с БД, чтобы знать что у нас 200 а не 500.
Павел
А уже на калькулятор навесить юнитов
Павел
ТАк мы проверим что и БД впоряде, и система ок, и простые юниты с минимальным кол-вом моков. Основная проблема тестов - это их подготовка и поддержка. И чем сложнее тот или иной фактор, тем дольше их писать, тем чаще они забиваются, тем медленее идет разработка основных фич
The Ant
Профитней один тест на контроллер или на сервис но с БД, чтобы знать что у нас 200 а не 500.
Ну не 1, хотяб валидные/невалмдные данные. Если фильтр есть парочку популярных.
Dmitriy
тесты эндпоинтов и паратест в помощь
Dmitriy
моки это ад
Павел
Ну не 1, хотяб валидные/невалмдные данные. Если фильтр есть парочку популярных.
Ну про 1, этот минимум, который позволит знать что система работает на положительном сценарии. А так да, можно увеличивать, зависит от предпочтений и целей. Все же тесты - код который мы пишем, поддерживаемый код и тех долг. Они не появляются из ниоткуда и не уходят в небытие.
Павел
Но с Юрием я тоже согласен, время тестов не надо исключать из факторов. Написать кучу мало полезных, но долгих тестов, которые ходят в БД, а потом ждать долгие ci - плохо и замедляет разработку.
Михаил
Я не говорю про то что юниты не нужны, я говорю о том что { $entity= $this->repository->get() $this->calculator->action($entity) $this->em->flush() } Нечего именно тут юнитами тестировать
Ну хотябы то, что 1) ты правильным способом забрал энтити 2) ты точно вызвал экшон 3) ты точно вызвал flush Функциональный тест на ту же логику будет работать только если ты правильно его напишешь. Допустим мы забыли вызвать flush. Какие проверки это не покажут: a) проверка только респонса, так как сущность поменялась в памяти но не применилась к бд, но при этом смапилась в респонс b) проверка по фикстурам, так как не будет реального запроса в бд, вы просто достанете по памяти из identity map измененную сущность.
Павел
Ну хотябы то, что 1) ты правильным способом забрал энтити 2) ты точно вызвал экшон 3) ты точно вызвал flush Функциональный тест на ту же логику будет работать только если ты правильно его напишешь. Допустим мы забыли вызвать flush. Какие проверки это не покажут: a) проверка только респонса, так как сущность поменялась в памяти но не применилась к бд, но при этом смапилась в респонс b) проверка по фикстурам, так как не будет реального запроса в бд, вы просто достанете по памяти из identity map измененную сущность.
Это дублирование логики кода в тесте. Хрупкость теста, белый ящик. Сложный хрупкий тест на моках, не вижу смысла. Флаша может и вообще не быть, он будет например в мидлваре или еще где. Я считаю что надо минимум тестов, с минимум сложностей которые покроют максмум кейсов , а не 100% покрытие тестов и тестирования всего и вся. Это всё надо писать поддерживать, это всё $
Павел
Т.е. писать тест на то, что кто то удалил флаш в ходе разработки, я считаю излишество.
Павел
Опять же можно проверить апи или бд и в ходе интегнрационного теста, что операция была выполнена
Михаил
Ну вы можете бесконечно придумывать условия благодаря которым вот подобные тесты не нужны.
Павел
Ну вы можете бесконечно придумывать условия благодаря которым вот подобные тесты не нужны.
Совершенно верно. А вы можете бесконечно стремиться к 100% покрытию и отставать в разработке фичей
Михаил
Т.е. писать тест на то, что кто то удалил флаш в ходе разработки, я считаю излишество.
Что собственно я и сделал, у меня был написан функциональный тест и я удалил флаш. Функциональный тест это не показал и я запорол фичу
Михаил
Опять же можно проверить апи или бд и в ходе интегнрационного теста, что операция была выполнена
Вы же понимаете что интеграционный и функциональные тесты дороги в обслуживании и мега хрупки. То есть вам по каждому чиху нужно будет лезть в огромную портянку из моков и проверок
Михаил
Сэкономьте себе время, вынесете комбинаторику и кучу неудобных проверок в юниты и не проверяйте это функциональными
Михаил
Они не хрупкие? У вас функциональные или интеграционные тесты связывают десятки или сотни классов. Это десятки или сотни причин для изменения. Вы пишите функциональные тесты без моков и фикстур? Реальные запросы чтоль в s3 там отправляете?
Михаил
Я не понимаю, зачем вы это рассказываете, если я выше это и написал
Хотите я вообще не буду писать? Так же просто оставаться правым, когда остальные молчат)?
Павел
Хотите я вообще не буду писать? Так же просто оставаться правым, когда остальные молчат)?
Вы просто пишите мне то, что я написал выше и рассказываете мне про мой код, который вы не видите и он не такой)))
Михаил
Вы просто пишите мне то, что я написал выше и рассказываете мне про мой код, который вы не видите и он не такой)))
Так не рассказывайте нам как тестировать не ВАШ код, который не протестировать без моков, в котором сложная логика и комбинаторика.
Павел
Вы просто не видите что я пишу и о чем я пишу,
Павел
Павел
Вот я писал как тестить комбинаторику
Павел
Хочу говорить, не хочу слушать - об этом я и говорю про вас. Я же не спорю с вами, я с вами солидрен. Что комбинаторику надо тестить юнитами без моков, с отсуствием зависимости по максимуму
Павел
Поэтому я не понимаю, что вы мне пытаетесь рассказать, если я с вами не спорю и согласен
Павел
Чистые классы и функции с минимум зависимостей для сложной логики и юнит тестов
Павел
Много зависимостей и минимум логики - интеграционные
Михаил
Я не говорю про то что юниты не нужны, я говорю о том что { $entity= $this->repository->get() $this->calculator->action($entity) $this->em->flush() } Нечего именно тут юнитами тестировать
Да, а я вам говорю что нужно и подобные вещи тестить, но вы придумаете миллион отговорок почему бы это не делать.
Павел
Да, а я вам говорю что нужно и подобные вещи тестить, но вы придумаете миллион отговорок почему бы это не делать.
Так то место где флаш - это место где куча зависимостей, и не то место где должна быть логика
Михаил
А ну и насчёт скорости. 1 юнит тест гораздо быстрее чем функциональный с бд
Михаил
Так то место где флаш - это место где куча зависимостей, и не то место где должна быть логика
Да, там может идти несколько вызовов экшонов, допустим ксли важен порядок Или условные вызовы, тогда тест точно нужен
Михаил
И вот у вас есть логика Вы не написали тест Дальше кто-то добавил if и тест это не покажет
Павел
Да, там может идти несколько вызовов экшонов, допустим ксли важен порядок Или условные вызовы, тогда тест точно нужен
Пишите как вам удобно и тестируете что вам удобно. Я буду как мне удобно. Не вижу смысла писать дополнительный тест, на то что был кем то удален флаш.
Михаил
Ураааа
Михаил
Мы закончили эту духомотину
Павел
Мы закончили эту духомотину
Вы ее начали зачем то)))
Павел
борьба сама с собой)))
Павел
Беседа уже была закончена и вы в ней не участвовали, но решили продолжить
Михаил
А вы хотите ограничить меня в высказывании своего мнения? Конечно же так всегда проще оставаться правым, когда остальные молчат
Павел
А вы хотите ограничить меня в высказывании своего мнения? Конечно же так всегда проще оставаться правым, когда остальные молчат
Почему, я согласил с Юрием и с другими участниками, вы же ворвались начали что то доказывать про какие то моки которых нет, при этом сказали что я душню. Много на себя берете Михаил
Михаил
Беседа уже была закончена и вы в ней не участвовали, но решили продолжить
Простите, я был занят в этот момент. В следующий раз позвоните мне к начале очередного спора
Михаил
Почему, я согласил с Юрием и с другими участниками, вы же ворвались начали что то доказывать про какие то моки которых нет, при этом сказали что я душню. Много на себя берете Михаил
Нет, я говорил о том что у всех разные кейсы и громко заявлять о том, вот так тестировать не нужно очень странно. И в конце концов вы согласились, то есть мы пришли к консенсусу.
Юра
Та вы просто спорите что лучше интеграционные тесты или юнит тесты
Павел
Нет, я говорил о том что у всех разные кейсы и громко заявлять о том, вот так тестировать не нужно очень странно. И в конце концов вы согласились, то есть мы пришли к консенсусу.
Верно, по мне странно. Это мое мнение и оно не изменилось. Это не значит, что я говорю за всех или так теперь надо всем делать или не делать.
Юра
Что лучше яблоки или арбузы
Павел
Та вы просто спорите что лучше интеграционные тесты или юнит тесты
На самом деле нет, я даже не понимаю о чем мы спорим
Павел
По мне юнитами тестировать апликейшен сервисы лишняя работа с большой морокой в виде моков и с минимум профита. Но если вам там лучше и хотите максимальное покрытие - ок, ваше право.
Павел
Т.е. по мне лучше сделать 20 % возможных тестов, чтобы сделать 80 % полезности, и не добивать потом еще 80% тестов, чтобы покрыть оставшиеся 20%. Но опять же это имхо.
Михаил
На самом деле нет, я даже не понимаю о чем мы спорим
Напомню, начали вот про этот ваш монолог. Дальше шло что-то про дублирование, я говорил что это не дублирование ну и так далее. А потом выяснилось что каждый останется при своём мнении, хотя если вы и не хотели это обсуждать то могли бы начать с этой фразы.
Павел
Сделать 3 мока, чтобы проверить что они вызывались последовательно. Не вижу смысла. Если видите - ок
Михаил
Ну вот поэтому я и ворвался, так как это была провокационная фраза, а я падок на провокации.