Как я могу запретить laravel запускать события внутри тестов?

Я только что написал laravel Наблюдатель. Он прикреплен к модели Company, так как я хочу знать пользователей, которые создали компанию. У меня есть большой набор других тестов, которые используют фабрики для создания компаний. Эти тесты теперь терпят неудачу, потому что наблюдателю нужен пользователь, но ни один пользователь не вошел в систему, когда вызывается фабрика.

CompanyObserver.php

class CompanyObserver {
    function created(Company $company) {
        info('USER ' . Auth::user()->id . ' created the new company ' . $company->id . '.';
    }
}

OldTests.php

Class OldTests {
    function testSomething() {
        // Now fails because observer is triggered but no use is logged in.
        $company = factory(Company::class)->create();

        // Random request
        $this->post('getCompany/' . $company->id)->assertStatus(200);
    }
}

Как я могу справиться с новым наблюдателем, который требует, чтобы пользователь вошел в систему для моих старых тестов? Должен ли я пойти и изменить все мои старые тесты?

Вы можете изменить наблюдателя, чтобы он выполнял Auth::check, прежде чем пытаться его использовать, или вы можете войти в свои старые тесты. Не уверен, что есть способ отключить события. Я думаю, это зависит от того, как вы их стреляете, может быть, вы можете поиздеваться над чем-то, чтобы не стрелять по-настоящему.

Bryan 02.07.2019 18:26

В начале вашего тестового звонка Event::fake(); больше информации о подделке события в документация

Mike 02.07.2019 20:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
2
2 080
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В начале вашего тестового звонка Event::fake();

Это подделает все события в тесте. Вы можете использовать функции утверждения для поддельного Event, чтобы завершить свои тесты и увидеть, что события были запущены.

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

$company = Event::fakeFor(function () {
    $company = factory(Company::class)->create();

    Event::assertDispatched(CompanyCreated::class);

    return $company;
});
//use $company for the rest of the test

Подробнее о подделке событий в документация

Таким образом, это будет означать, что для очень большой части моих тестов функций мои события будут сфальсифицированы. Я знаю, что могу подделать конкретное событие. Можно ли включить подделку событий, а затем выключить ее после того, как мои фабрики заработают? Я все еще хотел бы, чтобы они запускались во время выполнения моего производственного кода.

Tom Headifen 02.07.2019 21:13
Ответ принят как подходящий

В Laravel 8 это должно работать.

$company = Company::withoutEvents(function () {
        return Company::factory()->create();
    });

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