Павел
Юра
Я тут недавно глянул на уровень зп в дании. Так вот там ресепшионист получает в два раза больше чем software engineer
Юра
Software engineer где-то там внизу страницы
Юра
Пора переучиваться )
Юра
А если призвание иметь доход
Юра
Тогда наверное это в бизнес надо
Иван
Иван
так то можно хоть сериализовать в файл
Сергей
А если призвание иметь доход
Тут главное чтоб доход не "поимел" тебя :) (шутка)
А так это не призвание, это желание, и чтоб максимально эффективно его реализовать, нужно заниматься любимым делом, а занимаешься ты при этом бизнесом или работаешь на дядю не важно, главное гореть своим делом, тогда окружающие сами будут нести тебе деньги / предлагать должности. Примерно так это работает в большенстве случаев :)
Павел
И снова здратути) Вопрос: как замокать сервис в синк вызове мессенджера ?)
В тестах при замене сервиса у KernelBrowser , мок не попадает в контейнер который используется синхронным мессенджером.
Иван
Павел
Иван
ну мокай
вопрос в том, что это или юнит, который тестирует один сервис с моками
или интеграционный, который тестирует весь стек
а у тебя ни то ни другое
Иван
что именно ты так протестируешь?
Павел
Иван
так тестируй хендлер, а не мессенжер
Иван
мессенжер не ты писал
Павел
так тестируй хендлер, а не мессенжер
Ну вот пока так и делаю, но хотелось бы вызвать стартовый хэдлер и чтобы завелась вся цепочка хэдлеров (которые вызываются через очередь), а не вручную дергать поочереди
Иван
так, ещё раз
или юнит тест, или интеграционный
если ты боишься, что у тебя разваливается стек миддлвари и сообщения не доходят, то это не юнит тест
Павел
Иван
и тут вопрос, если ты так боишься, что оно развалится, что тебе надо тестить, то заменив сервис в контейнере, ты будешь тестировать не продовый контейнер,а тестовый
Павел
Я говорил что было бы хорошо хэндлер на простые составляющие распедалить чтобы потом юнитить, но как распедалить - пока нема.
Ну и хотелось бы просто смок тест запустить
Иван
просто замени в конфиге контейнера, где бы он не лежал, определение сервиса, укажи другой аргумент
Иван
для тестового энва
Павел
Иван
Вот мы вплотную подошли к вопросу, что публичное поле для сервиса не так уж и плохо.
Павел
Иван
прописываешь туда непосредственно мок
Иван
но при этом остро встаёт вопрос, что ты тестируешь какую-то дичь
вроде интеграционный, а вроде чёрт знает что
но если нравится, то тестируй
Павел
прописываешь туда непосредственно мок
Изначальный вопрос стоит в том, что у хэндлера который вызывается мессенджером, какой то свой контейнер к которому я не знаю как получить доступ. Вопрос в этом
Павел
То что я мокаю в тестах - не оказывается в хэдлере, если его дергает мессенджер
Павел
Если я дергаю хэдлер сам - моки норм срабатывают
Павел
Ну и сам хэдлер я не могу получить (в случае с мессенджером), чтобы что то там в паблик сунуть
Kirill
Ребята, как вы пишете тесты? Меня интересуют тесты API (сходи по такому-то url, получи такой-то ответ).
Нормально ли использовать отдельные файлы для каждого эндпоинта? Например, /api/user/{id}/categories - один файл, /api/user/{id}/groups - другой файл и тд.
И нормально ли использовать разные фикстуры для разных тестов? Вот для примера выше мне разные наборы данных нужны, например
Павел
Иван
а зачем тестировать ответы апи?
чтобы проверить, что в json правильно конвертится?
Konstantin
е2е полезная штука
Vlad
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
Konstantin
это псевдокод как их доставать. первым аргументом имя опции, вторым-дальше список источников из контекста - хттп-запрос, например
Konstantin
решаете вы в любом случае
Max
Печально)
Такая конструкция тоже будет говно https://github.com/IndraGunawan/facade-bundle#creating-facade ?
Konstantin
однозначно
Konstantin
подобным вы превращаете симфони в ларавель со всеми вытекающими. попробуйте ди, это не больно совсем. для вас не должно быть сложностью пихнуть этот несчастный резолвер зависимостью. может что-то не так делаете?
Max
Konstantin
окей, вернемся в начало: почему неудобно внедрять зависимость? можете показать примеры кода? я смутно догадываюсь, что это может быть нужно в out-of-container-scope классах, типа в сущности
Konstantin
тогда это плохо, да, но решаемо
Max
Но получилось не очень)
Konstantin
в кернел точно не надо, ваш код обязан ничего ни про какие кернелы не знать
Max
Понял. Спасибо!
Konstantin
попробуйте, в лишней зависимости точно нет проблемы. какой логгер/кешер легко может внедряться в сотню сервисов
Konstantin
это будет разница в одну строку (если у вас пхп 8+) - аргумент конструктора. внутри же нет разницы какой метод вызывать
Kirill
Подскажите, пожалуйста, как в функциональных тестах (используется codeception) можно проверить, что массив, который возвращается не содержит объектов с определенным айди?
Александр
Kirill
ну я думаю, может есть что-то типа cantSeeResponseContainsJson
Павел
Ну и проще будет искать, где какая опция юзается.
Upd Хотя наверное можно и по вызову констант/enum.
Max
The Ant
Есть у кого пример как в симфе асинхронно грузить файлы с помощью родного хттп клиента?
Не в память, прямо в файл
The Ant
в доке 1 файл тока мультиплексом. а надо несколько сразу.
The Ant
может и получится, но код будет лютое говнище )
Павел
The Ant
да не, дерьмо короче этот хттп клиент
Павел
😅
The Ant
какие-то чанки, миллиард ифов, что за говно? )