Как остановить подделку событий (переключить подделку событий) в модульном тестировании Laravel

Я разрабатываю приложение Laravel и выполняю модульное тестирование. Теперь у меня есть небольшая проблема с фальшивым и не фейковым событием Laravel в модульном тесте. Я пытаюсь сделать что-то вроде этого.

public function test_something()
{
     Event::fake();
     //Do somethng
     //Then I want to stop faking event here something like this
     Event::stopFaking(); //maybe
}

Я думаю, что мой код не требует пояснений. Как я могу достичь чего-то подобного в Laravel?

2 ответа

Решение

https://laravel.com/docs/5.7/mocking

Если вы хотите подделать прослушиватели событий только для части вашего теста, вы можете использовать метод fakeFor:

    $order = Event::fakeFor(function () {
        $order = factory(Order::class)->create();

        Event::assertDispatched(OrderCreated::class);

        return $order;
    });

    // Events are dispatched as normal and observers will run ...
    $order->update([...]);

Все внутри function() {} будут фальсифицировать события. Все снаружи будет функционировать нормально.

Event::fake Функция определена в Освещение \ Поддержка \ Фасады \ Событие.

Мы можем видеть, что есть fakeFor метод, который подделывает его только во время выполнения метода обратного вызова, а затем восстанавливает исходное поведение. Вы можете использовать это так:

public function test_something()
{
     Event::fakeFor(function () {
         //Do somethng
     });
}

Как разработчику Laravel, часто полезно читать исходный код, в этой среде есть много интересных фрагментов, которые не документированы!

Другие вопросы по тегам