
Антон
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

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
ок, допустим сделали репозиторий, туда вынесли все выборки. как быть с транзакциями? персисты и апдейты

Антон
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');
типа такого

Sergei
22.08.2017
12:25:09

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

Max
22.08.2017
12:26:01

Dmitry
22.08.2017
12:26:12

Max
22.08.2017
12:29:45

Антон
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 не имеет? Это отдельный паттерн

Антон
22.08.2017
12:34:48
>если переход от DM на AR требует отказаться от юнит тестов, то нафиг оно надо?
...

Sergey
22.08.2017
12:36:08

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

Dmitriy
22.08.2017
12:37:42

Dmitry
22.08.2017
12:38:06

Max
22.08.2017
12:44:14

Google

Sergey
22.08.2017
12:47:17

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

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

Dmitriy
22.08.2017
12:50:52

Dmitry
22.08.2017
12:50:58

Sergey
22.08.2017
12:51:24

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