rector-laravel-service-mocking maintained by remarkablemark
rector-laravel-service-mocking
Rector to replace deprecated Laravel service mocking testing methods such as expectsEvents, expectsJobs, and expectsNotifications.
From Laravel 10:
The deprecated
MocksApplicationServicestrait has been removed from the framework. This trait provided testing methods such asexpectsEvents,expectsJobs, andexpectsNotifications.If your application uses these methods, we recommend you transition to
Event::fake,Bus::fake, andNotification::fake, respectively. You can learn more about mocking via fakes in the corresponding documentation for the component you are attempting to fake.
Requirements
PHP >=8.2
Install
Install with Composer:
composer require --dev rector/rector remarkablemark/rector-laravel-service-mocking
Usage
Register the rule in rector.php:
<?php
declare(strict_types=1);
use Rector\Config\RectorConfig;
use Remarkablemark\RectorLaravelServiceMocking\LaravelServiceMockingRector;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/tests',
]);
$rectorConfig->rule(LaravelServiceMockingRector::class);
};
See the diff:
vendor/bin/rector process --dry-run
Apply the rule:
vendor/bin/rector process
Clear the cache and apply the rule:
vendor/bin/rector process --clear-cache
Rule
Before
$this->expectsEvents([MyEvent::class]);
After
\Illuminate\Support\Facades\Event::fake([MyEvent::class])->assertDispatched([MyEvent::class]);
The test may still fail because of assertDispatched so it's recommended to refactor to:
Event::fake([MyEvent::class]);
// dispatch your event here...
Event::assertDispatched(MyEvent::class);
If you have multiple events, call assertDispatched for each event:
Event::fake([MyEvent1::class, MyEvent2::class]);
// ...
Event::assertDispatched(MyEvent1::class);
Event::assertDispatched(MyEvent2::class);