Как остановить подделку событий (переключить подделку событий) в модульном тестировании 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?


person Wai Yan Hein    schedule 17.01.2019    source источник


Ответы (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() {} будет иметь поддельные события. Все снаружи будет работать нормально.

person ceejayoz    schedule 17.01.2019
comment
Спасибо друг. Это помогает. - person Wai Yan Hein; 17.01.2019

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

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

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

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

person Emil Vikström    schedule 17.01.2019
comment
Я просто хотел бы отметить, что это поведение задокументировано. - person ceejayoz; 17.01.2019