digitalcloud/testable-event-listener

一个Laravel可测试的事件监听器。

v0.1 2018-12-31 11:54 UTC

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