@symfony_php

Страница 275 из 1418
Антон
22.08.2017
11:42:00
попробуй моему боссу объясни =)

думаю что есть зависимость от сложности проекта к низкоуровневости фреймворка. проще приложение и проще фреймворк

Sergey
22.08.2017
11:46:06
весело наверное мокать работу с базой когда у тебя AR

типа ларавеля

Google
Dmitry
22.08.2017
11:46:26
да понятно, что если вы делаете корп сайт с новостями, абсолютно пофиг дм или ар

прекрасно можно мокать базу, если нужно. вопрос в том, а зачем нужно мокать базу

Антон
22.08.2017
11:48:43
нормально мокается

Sergey
22.08.2017
11:50:59
у тебя в методе некий User::find(1) как ты это замокаешь?

Dmitry
22.08.2017
11:54:29
а зачем тебе писать юнит тест на функционал фреймворка, у которого к тому же свои юнит тесты

Boris
22.08.2017
11:55:38
попробуй моему боссу объясни =)
для этого у вас есть СТО или тип того)

Антон
22.08.2017
11:56:02
да уж не все так гладко как кажется

хотя сам сейчас doctrine изучаю. ) пишу пока на laravel. CTO как такового нет. небольшая компания торговая

интернет магазин написали на Laravel+Eloquent.

https://laravel.com/docs/5.4/mocking все мокается, даже Job (Command Bus)

просто стараюсь все на сервисах делать. и норм. и тестируется норм

Sergey
22.08.2017
12:00:16
а зачем тебе писать юнит тест на функционал фреймворка, у которого к тому же свои юнит тесты
в смысле на функционал фреймворка? у тебя есть сервис, внутри которого из базы достается юзер. как мне юнит тестом проверить этот сервис, если там выборка на статических методах?

Google
Sergey
22.08.2017
12:00:28
Антон
22.08.2017
12:00:50
Sergey так ненадо делать статические методы

Sergey
22.08.2017
12:01:22
$flights = App\Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get();

дока врет?

Dmitry
22.08.2017
12:01:26
И это не проблема AR, это проблема реализации файндера... который, вообще-то, к AR не имеет никакого отношения

Например, Yii во второй версии вынесла файндер в отдельную сущность

Sergey
22.08.2017
12:05:19
$user = new User; $user->username = 'philipbrown'; $user->save(); ок, у меня в методе вот такое используется. юнит тест упадет с ошибкой, как быть с save?

http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#querying-data вот дока yii

что мешает использовать репозиторий?
наверное то что в AR реализациях везде смешаны выборки и модели?

Dmitry
22.08.2017
12:08:17
и что? вводи слой репозитория. в котором будет выборки

А если ты собираешься юниттестировать работу с базой так активно, используй тестовую базу и фикстуры, не трать свое время

Sergey
22.08.2017
12:08:40
ага.. и в этот репозиторий еще save вынести

и можно называть это дата маппером

А если ты собираешься юниттестировать работу с базой так активно, используй тестовую базу и фикстуры, не трать свое время
нет, я не хочу тестировать базу. я хочу протестировать конкретный юнит, не затрагивая сеть и другие сервисы

Антон
22.08.2017
12:11:29
у нас в отдельных классах все методы выборок, их можно замокать. плюс для тестов мы используем stage server

мне кажется поздно гонять тесты на боевой бд, по сути ты уже поломанный релиз выложил

Dmitry
22.08.2017
12:12:21
так тестируй, ваще не понмаю в чем проблема... в том, что ты в сервис статикой посажал работу с моделями? ну так это не проблема AR, это твоя архитектура

Антон
22.08.2017
12:12:48
я тоже не понимаю в чем проблема

Sergey
22.08.2017
12:13:19
$user = new User; $user->username = 'philipbrown'; $user->save(); ок, у меня в методе вот такое используется. юнит тест упадет с ошибкой, как быть с save?

Google
Sergey
22.08.2017
12:13:24
вы игнорируете то что я пишу?

выше сбрасывал линки на доки yii и laravel

где явно описаны примеры выборок

это не я придумал статику делать, это советуют в доке

Daniel
22.08.2017
12:13:48


Dmitry
22.08.2017
12:14:32
В доке советуют для начинающих. Ты начинающий?

Антон
22.08.2017
12:14:44
where не статический метод

Sergey
22.08.2017
12:14:54
ок, допустим сделали репозиторий, туда вынесли все выборки. как быть с транзакциями? персисты и апдейты

where не статический метод
$flights = App\Flight::where('active', 1) а что это тогда?)

В доке советуют для начинающих. Ты начинающий?
а где дока для продвинутых тогда?)

Антон
22.08.2017
12:16:32
это магия

Dmitry
22.08.2017
12:16:45
для продвинутых дока - код

Антон
22.08.2017
12:16:49
?

Dmitry
22.08.2017
12:17:36
а у тебя с твоими потребностями "там вставить, там транзакция" - используй тестовую базу и фикстуры

Антон
22.08.2017
12:18:12
а правильно ли вообще тестировать на проде?

Sergey
22.08.2017
12:18:15
зачем мне база и фикстуры если мне достаточно будет моков?

Dmitry
22.08.2017
12:19:51
Если у тебя такая архитектура, что замена слоя персиста с DM на AR и т.п. сказывается на возможности писать юнит-тесты, то моков тебе будет не достаточно

или у тебя сервис работает формализовано через репу, когда точно известно, какой метод какой набор сущностей вернет, тогда еще можно замокать... или же у тебя в сервисе прямая работа со слоем персиста, и тогда ты задолбаешься делать моки... это все-равно, что поместить прямо в сервисе $em->createQueryBuilder() и удивляться, что трудно тестировать

Антон
22.08.2017
12:22:39
насчет статических методов из доки: Facades provide a "static" interface to classes that are available in the application's service container. Laravel ships with many facades which provide access to almost all of Laravel's features. Laravel facades serve as "static proxies" to underlying classes in the service container, providing the benefit of a terse, expressive syntax while maintaining more testability and flexibility than traditional static methods.

Sergei
22.08.2017
12:23:46
Ох Laravel на Mockery строит свои тесты Он и статику мокает и приватные методы. Правда там приходится изолированно тесты запускать и страдать, но Mockery успешно вам замокает App\Flight::where

Google
Антон
22.08.2017
12:24:18
$modelMock = Model::shouldReceive('find') ->with('1') ->andReturn('value');

типа такого

Антон
22.08.2017
12:25:24
можно еще трейт подкрутить DatabaseTransactions который после теста откатывает изменения в бд

из коробки

Max
22.08.2017
12:26:01
$user = new User; $user->username = 'philipbrown'; $user->save(); ок, у меня в методе вот такое используется. юнит тест упадет с ошибкой, как быть с save?
можно зають Mockery чтобы затестить поведение, для твоего кейса - хз я бы выносил в отдельную штуку, типо UserProvider или еще что-то

Антон
22.08.2017
12:30:07
ну так where это не статический метод жеж

Admin
ERROR: S client not available

Dmitry
22.08.2017
12:32:34
Еще раз, проблема не в том, что AR хреновый, проблема в том, что вы завязали сервис на него. В случае доктрины вы, наверняка, репозиторий будете инжектить... и потом его мокать. Что мешает это делать в ларавеле? Да ничего, кроме костности

Sergey
22.08.2017
12:33:37
в доктрине есть такое понятие как репозиторий, и кастомные репозитории расширяющие базовые. а в yii/laravel я такого в принципе не вижу если переход от DM на AR требует отказаться от юнит тестов, то нафиг оно надо? замокать через мокери ты конечно можешь что угодно, еще можно runkit затащить. только вот от этого код не становится лучше

Dmitry
22.08.2017
12:34:40
да, но ты хоть понимаешь, что понятие "репозиторий" вообще никакого отнощения к DM не имеет? Это отдельный паттерн

Sergey
22.08.2017
12:36:08
Dmitry
22.08.2017
12:37:18
и что? ты там увидел слова Data Maper и подвис? ;)

Google
Sergey
22.08.2017
12:47:17
и что? ты там увидел слова Data Maper и подвис? ;)
репозиторий нужен не только для хранения выборок и уменьшения дублирования кода. он предоставляет абстракцию для работы с хранилищем. но в AR у тебя модели и так имеют доступ к хранилищу

Dmitry
22.08.2017
12:47:43
тебя никто не заставляет использовать это

Sergey
22.08.2017
12:48:28
не обязательно отказываться, прост будет разные подходы к тестам
мокать можешь что угодно, хоть ядро пхп. но еще раз говорю что код от этого лучше у тебя не станет

Dmitriy
22.08.2017
12:48:33
и в чем отличие?
паттерт не должен зависеть от реализации. т.е. не должен возвращать например entity или коллекцю доктрины

Dmitry
22.08.2017
12:48:34
заменит $model->save() на $repo->add($model) и уже в репе сделай save().

Sergey
22.08.2017
12:48:54
если у тебя выборки в репосе, сохранение тоже в репосе

возьми обычный дата маппер, сделай анемичную модель и радуйся жизни

Dmitry
22.08.2017
12:49:58
паттерт не должен зависеть от реализации. т.е. не должен возвращать например entity или коллекцю доктрины
entity - это вообще-то доменые сущности... ну, вернее, их можно ими представить, а если не хочется - ничто не мешает в репе выдавать доменные сущности созданные на основе entity

Sergei
22.08.2017
12:50:47
в какой точке
В точке инжектирования репозитория и мы инжектим мок репа а не сам репозиторий Тоже и для сохранения сущности.

Dmitry
22.08.2017
12:50:58
если у тебя выборки в репосе, сохранение тоже в репосе
а у AR профит один - он проще для простых моделей с простой логикой

тут мы опять зависим от доменных сущностей доктрины
и? репозиторий - это коллекция доменных сущностей

Dmitriy
22.08.2017
12:52:39
и? репозиторий - это коллекция доменных сущностей
которые не зависят от реализации . тогда да

Dmitry
22.08.2017
12:52:46
чем DM, хотя, конечно, тут правильнее говорить о конкретных реализациях... но в общем да, разница будет небольшая, особо учитывая, что 95% использования DM - прямой мапинг сущности на таблицы

которые не зависят от реализации . тогда да
от реализации чего? ;) репозиторий - это как раз инкапсулирование работы со стораджами

Sergey
22.08.2017
12:53:40
у тебя на каждой модели висит референс к коннекту базы. какая еще инкапсуляция работы со стораджами?

Dmitriy
22.08.2017
12:53:57
+

Dmitry
22.08.2017
12:54:21
+
чо плюс, ты вообще о доктрине говоришь, а сергей про AR :)

Sergei
22.08.2017
12:54:44
Вы тут говорите что не надо пользоватся доками надо что то изобретать чтоб потом не страдать в тестах Но как бы я приду и буду делать по документации в которой статические методы и отсуствие репозиториев

Dmitry
22.08.2017
12:54:46

Страница 275 из 1418