Laravel事件触发,但PHPUnit没有检测到它被触发

时间:2016-03-11 19:01:03

标签: laravel events testing laravel-5 phpunit

我正在进行测试以确保我的事件正常启动。

MyTest的

/** @test */
public function foil_products_DO_trigger_oos_event ()
{
    $this->setUpTheWorld(true, 1);
    $response = $this->sendInStockData($this->pusher, Carbon::now()->subHour());

    $this->expectsEvents(\App\Events\InventoryOutOfStock::class);
    $this->sendCustomStockData($this->pusher, 0, 1, Carbon::now());

    // TEST THE RESULTS OF THE LISTENER FOR THAT EVENT
    $this->pusher = $this->pusher->fresh();
    $this->assertEquals(1, $this->pusher->oos);

    $this->assertCount(2, $this->pusher->inventories, "Pusher doesnt have 2 Inventories");
    $this->assertEquals(0, $this->pusher->latestInventory->tags_blocked);
}

如果我注释掉这一行:

    $this->expectsEvents(\App\Events\InventoryOutOfStock::class);

然后我的测试将通过。这一行:

    $this->assertEquals(1, $this->pusher->oos);

传递,只有在事件触发时才会发生这种情况。另外,我查看了我的日志文件,我可以保证事件被解雇....

我告诉PHPUnit这些事件会被解雇吗?

谢谢!

EventServiceProvider

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        \App\Events\InventoryOutOfStock::class => [
            \App\Listeners\InventoryOutOfStockUpdater::class,
            \App\Listeners\EmailInventoryOutOfStockNotification::class,
            \App\Listeners\SMSInventoryOutOfStockNotification::class,
        ],
    ];

    /**
     * Register any other events for your application.
     *
     * @param  \Illuminate\Contracts\Events\Dispatcher  $events
     * @return void
     */
    public function boot(DispatcherContract $events)
    {
        parent::boot($events);
    }
}

2 个答案:

答案 0 :(得分:2)

我意识到这是一个非常古老的问题,但我遇到了这个问题,我想我会发布解决方案。

$this->expectsEvents($events)

不像断言那样工作。直到最后它才会断言。它的作用是,一旦它到达那条线,它就会在你说出你预期之后发生这个事件。

TL; DR将expectedEvents行放在测试方法的顶部。

这是一个模糊文档的链接,但并没有真正解释这一点,但他们确实这么说。的种类。 https://laravel.com/docs/5.2/testing#mocking-events

答案 1 :(得分:2)

有点老问题,但我认为以前的答案并没有真正解决问题。

这里的问题是你希望你的事件能够被激活并且听众会做一些事情,而这里不会发生这种情况。调用expectsEvent()断言事件被触发但是阻止了侦听器被触发,正如官方文档所述:

  

Laravel提供了一种方便的expectsEvents方法来验证预期的事件被触发,但是阻止这些事件的任何处理程序运行

了解详情:https://laravel.com/docs/5.2/testing#mocking-events

尝试简化和分离您的测试。根据复杂性和关注点的分离,仅测试事件被触发,或者监听器执行预期的操作。