digitalcloud / testable-event-listener
一个Laravel可测试的事件监听器。
v0.1
2018-12-31 11:54 UTC
Requires
- php: >=7.1.0
This package is auto-updated.
Last update: 2024-09-18 21:14:38 UTC
README
当使用TTD模式开发时,Laravel允许您伪造任何事件。伪造事件将阻止事件调度器触发该事件,因此,该事件的任何监听器都不会执行。但在某些情况下,我们需要触发此事件但执行一些监听器而忽略其他监听器,这就是我们创建此包的原因。
此包允许您在测试期间触发事件,但限制对此事件的监听器。
安装
您可以通过composer安装此包
composer require digitalcloud/testable-event-listener
使用示例
假设我们有一个在创建新用户时触发的事件,在正常行为中,我们为此事件有许多监听器,但在测试期间我们希望执行其中一些事件而忽略其他事件。
当Eloquent创建事件触发时,用户模型将触发\App\Events\UserCreating事件。
<?php namespace App; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { protected $dispatchesEvents = [ 'creating' => \App\Events\UserCreating::class ]; }
我们的EventServiceProvider看起来像这样
<?php namespace App\Providers; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { // ... protected $listen = [ \App\Events\UserCreating::class => [ // ... \App\Listeners\UserCreating::class, \App\Listeners\UserCreated::class, // ... ], ]; // ... }
但在测试时,我们只需要运行一个监听器,\App\Listeners\UserCreating::class,并忽略所有其他监听器。为此,我们可以调用EventFaker:fake并传入要执行所需监听器的伪造事件数组。
<?php namespace Tests\Unit; use App\User; use DigitalCloud\TestableEventListener\EventFaker; use Tests\TestCase; class ExampleTest extends TestCase { /** * A basic test example. * * @return void */ public function testBasicTest() { EventFaker::fake([ \App\Events\UserCreating::class => [ \App\Listeners\UserCreating::class ], ]); $user = factory(User::class)->create(); EventFaker::assertDispatched(\App\Events\UserCreating::class); } }
结果是
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.
"App\Listeners\UserCreating::handle"
Time: 863 ms, Memory: 14.00MB
OK (1 test, 1 assertion)
Process finished with exit code 0