Юра
Я тут недавно глянул на уровень зп в дании. Так вот там ресепшионист получает в два раза больше чем software engineer
Юра
Software engineer где-то там внизу страницы
Юра
Пора переучиваться )
Александр
Пора переучиваться )
Работа это в первую очередь призвание, а потом уже доход)
Юра
А если призвание иметь доход
Юра
Тогда наверное это в бизнес надо
Иван
так то можно хоть сериализовать в файл
Сергей
А если призвание иметь доход
Тут главное чтоб доход не "поимел" тебя :) (шутка) А так это не призвание, это желание, и чтоб максимально эффективно его реализовать, нужно заниматься любимым делом, а занимаешься ты при этом бизнесом или работаешь на дядю не важно, главное гореть своим делом, тогда окружающие сами будут нести тебе деньги / предлагать должности. Примерно так это работает в большенстве случаев :)
Павел
И снова здратути) Вопрос: как замокать сервис в синк вызове мессенджера ?) В тестах при замене сервиса у KernelBrowser , мок не попадает в контейнер который используется синхронным мессенджером.
Иван
ну мокай вопрос в том, что это или юнит, который тестирует один сервис с моками или интеграционный, который тестирует весь стек а у тебя ни то ни другое
Иван
что именно ты так протестируешь?
Иван
так тестируй хендлер, а не мессенжер
Иван
мессенжер не ты писал
Павел
ну мокай вопрос в том, что это или юнит, который тестирует один сервис с моками или интеграционный, который тестирует весь стек а у тебя ни то ни другое
Согласен, юнит был бы лучше. Но для юнита надо распедаливать норм архитектуру, то что я написал в этом хэндлере, пока чет мозга не хватает. Тестирую общую работу обработки данных полученных извне. Вот эти данные и хочу мокнуть
Павел
так тестируй хендлер, а не мессенжер
Ну вот пока так и делаю, но хотелось бы вызвать стартовый хэдлер и чтобы завелась вся цепочка хэдлеров (которые вызываются через очередь), а не вручную дергать поочереди
Иван
так, ещё раз или юнит тест, или интеграционный если ты боишься, что у тебя разваливается стек миддлвари и сообщения не доходят, то это не юнит тест
Иван
и тут вопрос, если ты так боишься, что оно развалится, что тебе надо тестить, то заменив сервис в контейнере, ты будешь тестировать не продовый контейнер,а тестовый
Павел
Я говорил что было бы хорошо хэндлер на простые составляющие распедалить чтобы потом юнитить, но как распедалить - пока нема. Ну и хотелось бы просто смок тест запустить
Иван
просто замени в конфиге контейнера, где бы он не лежал, определение сервиса, укажи другой аргумент
Иван
для тестового энва
Иван
Вот мы вплотную подошли к вопросу, что публичное поле для сервиса не так уж и плохо.
Иван
прописываешь туда непосредственно мок
Иван
но при этом остро встаёт вопрос, что ты тестируешь какую-то дичь вроде интеграционный, а вроде чёрт знает что но если нравится, то тестируй
Павел
прописываешь туда непосредственно мок
Изначальный вопрос стоит в том, что у хэндлера который вызывается мессенджером, какой то свой контейнер к которому я не знаю как получить доступ. Вопрос в этом
Павел
То что я мокаю в тестах - не оказывается в хэдлере, если его дергает мессенджер
Павел
Если я дергаю хэдлер сам - моки норм срабатывают
Павел
Ну и сам хэдлер я не могу получить (в случае с мессенджером), чтобы что то там в паблик сунуть
Kirill
Ребята, как вы пишете тесты? Меня интересуют тесты API (сходи по такому-то url, получи такой-то ответ). Нормально ли использовать отдельные файлы для каждого эндпоинта? Например, /api/user/{id}/categories - один файл, /api/user/{id}/groups - другой файл и тд. И нормально ли использовать разные фикстуры для разных тестов? Вот для примера выше мне разные наборы данных нужны, например
Иван
а зачем тестировать ответы апи? чтобы проверить, что в json правильно конвертится?
Konstantin
е2е полезная штука
Vlad
использую доволен как слон
Konstantin
это полезная штука, но чутка не про то: человеку надо иметь уверенность, что /users/1 будет иметь "name": "John"
Vlad
пхпюнит вроде умеет сравнивать джсоны
Vlad
из коробки
Konstantin
да что угодно умеет, вопрос не о том-то
Max
Всем привет. Подскажите плз как лучше реализовать такую задачу - в проекте есть большое количество "настроек", мы назвали их Option. Что-то вроде feature switcher Они хранятся в файле (настройки по умолчанию), затем переписываются настройками из БД. И если в запросе от пользователя пришли другие options, они заменяют уже имеющиеся. Далее в коде нужно работать с этими options. Удобно не дёргать их каждый раз из DI, а вызвать Option::get('optionName'). Как лучше их инициализировать? На синглтон похоже, что совсем не гуд...
Konstantin
$optionService->resolve(FooOptionEnum::OptName, $request)
Konstantin
и этот ваш опшнсервис везде таскать зависимостью
Max
$optionService->resolve(FooOptionEnum::OptName, $request)
Это заменит текущие option-ы из запроса. Ок, это не проблема. А дальше по коду как их дергать?
Max
и этот ваш опшнсервис везде таскать зависимостью
Вот это не удобно. Других вариантов нет?)
Konstantin
это псевдокод как их доставать. первым аргументом имя опции, вторым-дальше список источников из контекста - хттп-запрос, например
Konstantin
Вот это не удобно. Других вариантов нет?)
нет, остальные варианты кроме ди - говно. если вам ок иметь слаботестируемый и прибитый гвоздями говнокод - варианты есть
Konstantin
решаете вы в любом случае
Max
Печально) Такая конструкция тоже будет говно https://github.com/IndraGunawan/facade-bundle#creating-facade ?
Konstantin
однозначно
Konstantin
подобным вы превращаете симфони в ларавель со всеми вытекающими. попробуйте ди, это не больно совсем. для вас не должно быть сложностью пихнуть этот несчастный резолвер зависимостью. может что-то не так делаете?
Konstantin
окей, вернемся в начало: почему неудобно внедрять зависимость? можете показать примеры кода? я смутно догадываюсь, что это может быть нужно в out-of-container-scope классах, типа в сущности
Konstantin
тогда это плохо, да, но решаемо
Max
окей, вернемся в начало: почему неудобно внедрять зависимость? можете показать примеры кода? я смутно догадываюсь, что это может быть нужно в out-of-container-scope классах, типа в сущности
Почему не удобно - потому-что нужно будет прокинуть его вообще везде. В каждый сервис, контроллер. Вот и подумали, что можно условно вытащить из ядра в любом участке кода. Типа $kernel->getOption('optionName') или как я писал Option::get('optionName')
Max
Но получилось не очень)
Konstantin
в кернел точно не надо, ваш код обязан ничего ни про какие кернелы не знать
Max
Понял. Спасибо!
Konstantin
попробуйте, в лишней зависимости точно нет проблемы. какой логгер/кешер легко может внедряться в сотню сервисов
Konstantin
это будет разница в одну строку (если у вас пхп 8+) - аргумент конструктора. внутри же нет разницы какой метод вызывать
Kirill
Подскажите, пожалуйста, как в функциональных тестах (используется codeception) можно проверить, что массив, который возвращается не содержит объектов с определенным айди?
Kirill
ну я думаю, может есть что-то типа cantSeeResponseContainsJson
Gleb
Подскажите, пожалуйста, как в функциональных тестах (используется codeception) можно проверить, что массив, который возвращается не содержит объектов с определенным айди?
А он куда возвращается? Либо перебирать, либо это положить в фейковый/тестовый репозиторий и там уже https://codeception.com/docs/modules/Doctrine2.html#dontSeeInRepository Но последний вариант больше выглядит как костыль.
Павел
$optionService->resolve(FooOptionEnum::OptName, $request)
@ykweb Мне каежтся для удобства можно еще прикрепить над эти делом фасадик, который под капотом достает $request + сделать методы, для автокомплита будет удобнее, наверное. Итого будет $requestOptionResolver->optName()
Павел
Ну и проще будет искать, где какая опция юзается. Upd Хотя наверное можно и по вызову констант/enum.
The Ant
Есть у кого пример как в симфе асинхронно грузить файлы с помощью родного хттп клиента? Не в память, прямо в файл
The Ant
в доке 1 файл тока мультиплексом. а надо несколько сразу.
Павел
Есть у кого пример как в симфе асинхронно грузить файлы с помощью родного хттп клиента? Не в память, прямо в файл
Впервые такой кейс прочитал, интересненько. А почему через мультиплекс не получится несколько файлов? Карту ресурсов и респонсов сохраняешь, потом сохраняешь чанки по ним в ресурсы файлов
The Ant
может и получится, но код будет лютое говнище )
The Ant
да не, дерьмо короче этот хттп клиент
Павел
😅
The Ant
какие-то чанки, миллиард ифов, что за говно? )