Size: a a a

2020 September 18

D

Dymon in Laravel Pro
kaktus778
привет всем)) вчера задавал вопрос)) но поздно было, наверно все спали, никто не ответил))
вопрос к тем кто тесты пишет - у вас при выполнении фьюч тестов эвенты в приложении норм отрабатывают? а то у меня чет они вообще не запускаются)
код бы показал который тестишь и сами тесты. и как ты определяешь что события не запускаются?
источник

k

kaktus778 in Laravel Pro
@nex_otaku @faqphp @ditrichZ
вот эвент...
        $this->eventDispatcher->dispatch(
           CategoryTreeChanged::class,
           [
               'categories' => new ArrayCollection([$courseCategory->category()])
           ]
       );

а вот его листенер...
class OnCategoryCourseRecount implements ShouldQueue
{

   private CategoryRepository $repository;
   private CategoryCourseCounterService $service;

   public function __construct(CategoryCourseCounterService $service, CategoryRepository $repository)
   {
       $this->repository = $repository;
       $this->service = $service;
   }

   public function handle(Collection $categories): void
   {
       $ids = $categories->map(function (Category $category){
          return $category->id()->value();
       })->getValues();
       $this->service->countCategories($this->repository->findByIds($ids));
   }

}

фейкового диспатчера нет... эти эвенты внутри приложения, не в тестах..
ПС на странность handle не обращайте внимания.. мы юзаем doctrine вместо eloquent..
а ее сущности не переживают сериализацию..
источник

А

Антон in Laravel Pro
kaktus778
@nex_otaku @faqphp @ditrichZ
вот эвент...
        $this->eventDispatcher->dispatch(
           CategoryTreeChanged::class,
           [
               'categories' => new ArrayCollection([$courseCategory->category()])
           ]
       );

а вот его листенер...
class OnCategoryCourseRecount implements ShouldQueue
{

   private CategoryRepository $repository;
   private CategoryCourseCounterService $service;

   public function __construct(CategoryCourseCounterService $service, CategoryRepository $repository)
   {
       $this->repository = $repository;
       $this->service = $service;
   }

   public function handle(Collection $categories): void
   {
       $ids = $categories->map(function (Category $category){
          return $category->id()->value();
       })->getValues();
       $this->service->countCategories($this->repository->findByIds($ids));
   }

}

фейкового диспатчера нет... эти эвенты внутри приложения, не в тестах..
ПС на странность handle не обращайте внимания.. мы юзаем doctrine вместо eloquent..
а ее сущности не переживают сериализацию..
Тест покажи
источник

NO

Nex Otaku in Laravel Pro
Бросить эксепшен в хендлере можно для проверки, вызван был код или нет )
источник

k

kaktus778 in Laravel Pro
Антон
Тест покажи
так это фьюч тест... создаю категории.. в них создаю курсы... после создания курса должен вызываться эвент для пересчета количества курсов в дереве - я показываю что жду от него.. а он нули возвращает...
источник

А

Антон in Laravel Pro
kaktus778
@nex_otaku @faqphp @ditrichZ
вот эвент...
        $this->eventDispatcher->dispatch(
           CategoryTreeChanged::class,
           [
               'categories' => new ArrayCollection([$courseCategory->category()])
           ]
       );

а вот его листенер...
class OnCategoryCourseRecount implements ShouldQueue
{

   private CategoryRepository $repository;
   private CategoryCourseCounterService $service;

   public function __construct(CategoryCourseCounterService $service, CategoryRepository $repository)
   {
       $this->repository = $repository;
       $this->service = $service;
   }

   public function handle(Collection $categories): void
   {
       $ids = $categories->map(function (Category $category){
          return $category->id()->value();
       })->getValues();
       $this->service->countCategories($this->repository->findByIds($ids));
   }

}

фейкового диспатчера нет... эти эвенты внутри приложения, не в тестах..
ПС на странность handle не обращайте внимания.. мы юзаем doctrine вместо eloquent..
а ее сущности не переживают сериализацию..
А почему в handle нет CategoryTreeChanged $event?
источник

NO

Nex Otaku in Laravel Pro
ФЬЮЧ
источник

NO

Nex Otaku in Laravel Pro
😂
источник

k

kaktus778 in Laravel Pro
Nex Otaku
Бросить эксепшен в хендлере можно для проверки, вызван был код или нет )
я dd юзаю)) руками запускаю эндпоинт скрипт стопорится))
в тесте нет))
источник

NO

Nex Otaku in Laravel Pro
поменяй на эксепшен
источник

NO

Nex Otaku in Laravel Pro
возможно результат тебя удивит
источник

k

kaktus778 in Laravel Pro
Nex Otaku
поменяй на эксепшен
поменял)) тоже самое)) даже конструктор не вызывается))
источник

D

Dymon in Laravel Pro
kaktus778
@nex_otaku @faqphp @ditrichZ
вот эвент...
        $this->eventDispatcher->dispatch(
           CategoryTreeChanged::class,
           [
               'categories' => new ArrayCollection([$courseCategory->category()])
           ]
       );

а вот его листенер...
class OnCategoryCourseRecount implements ShouldQueue
{

   private CategoryRepository $repository;
   private CategoryCourseCounterService $service;

   public function __construct(CategoryCourseCounterService $service, CategoryRepository $repository)
   {
       $this->repository = $repository;
       $this->service = $service;
   }

   public function handle(Collection $categories): void
   {
       $ids = $categories->map(function (Category $category){
          return $category->id()->value();
       })->getValues();
       $this->service->countCategories($this->repository->findByIds($ids));
   }

}

фейкового диспатчера нет... эти эвенты внутри приложения, не в тестах..
ПС на странность handle не обращайте внимания.. мы юзаем doctrine вместо eloquent..
а ее сущности не переживают сериализацию..
implements ShouldQueue - у тебя же события через очередь отрабатывают, т.е. по идее хендлер запустится после теста. Имхо такое лучше мокать https://laravel.com/docs/7.x/mocking#event-fake
источник

А

Антон in Laravel Pro
Dymon
implements ShouldQueue - у тебя же события через очередь отрабатывают, т.е. по идее хендлер запустится после теста. Имхо такое лучше мокать https://laravel.com/docs/7.x/mocking#event-fake
В тесте должен стоять драйвер sync
источник

NO

Nex Otaku in Laravel Pro
ну а диспетчер флашить не надо там?
источник

k

kaktus778 in Laravel Pro
Dymon
implements ShouldQueue - у тебя же события через очередь отрабатывают, т.е. по идее хендлер запустится после теста. Имхо такое лучше мокать https://laravel.com/docs/7.x/mocking#event-fake
у меня sync стоит
источник

NO

Nex Otaku in Laravel Pro
может принудительно флашнуть и он дёрнет их
источник

А

Антон in Laravel Pro
Nex Otaku
может принудительно флашнуть и он дёрнет их
Какой еще флашер? Когда это на слушатели влияло? Тут тебе не симфони
источник

NO

Nex Otaku in Laravel Pro
я не юзал эвенты в ларке ) пытаюсь угадать просто )
источник

k

kaktus778 in Laravel Pro
Nex Otaku
ну а диспетчер флашить не надо там?
имеешь ввиду flush после dispatch ?
        $this->eventDispatcher->flush(CategoryTreeChanged::class);

не воркает)
источник