Я только что написал 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);
}
}
Как я могу справиться с новым наблюдателем, который требует, чтобы пользователь вошел в систему для моих старых тестов? Должен ли я пойти и изменить все мои старые тесты?
В начале вашего тестового звонка Event::fake(); больше информации о подделке события в документация






В начале вашего тестового звонка 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
Подробнее о подделке событий в документация
Таким образом, это будет означать, что для очень большой части моих тестов функций мои события будут сфальсифицированы. Я знаю, что могу подделать конкретное событие. Можно ли включить подделку событий, а затем выключить ее после того, как мои фабрики заработают? Я все еще хотел бы, чтобы они запускались во время выполнения моего производственного кода.
В Laravel 8 это должно работать.
$company = Company::withoutEvents(function () {
return Company::factory()->create();
});
Вы можете изменить наблюдателя, чтобы он выполнял
Auth::check, прежде чем пытаться его использовать, или вы можете войти в свои старые тесты. Не уверен, что есть способ отключить события. Я думаю, это зависит от того, как вы их стреляете, может быть, вы можете поиздеваться над чем-то, чтобы не стрелять по-настоящему.