我正在进行测试以确保我的事件正常启动。
/** @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这些事件会被解雇吗?
谢谢!
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);
}
}
答案 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
尝试简化和分离您的测试。根据复杂性和关注点的分离,仅测试事件被触发,或者监听器执行预期的操作。