在查看了MocksApplicationServices
的代码之后,我成功地利用trait并在withoutEvents()
方法中捕获到它所包含的字段。
相应的扩展代码如下:
function test_fires_multiple_events()
{
$this->withoutEvents();
$c = collect($this->firedEvents)
->groupBy(function($item, $key) { return get_class($item); })
->map(function($item, $key) { return $item->count(); });
$this->assertsEqual(3, $c->get(SomeEvent::class));
}
为了解释collection做了什么:
1) collect($this->firedEvents)
: 获取捕获的事件并将其存储在一个集合中。重要的是要注意,MocksApplicationServices
将每个事件推送到一个数组中,这意味着它已经在计算。
2) groupBy(function($item, $key) { return get_class($item); })
: 按类名分组,因此现在我们有一组数组。
3) map(function($item, $key) { .. }
: 简单地累加子项。
这将产生像下面这样的结构:
Illuminate\Support\Collection (1) (
protected items -> array (2) [
'App\Events\SomeEvent' => integer 2
'App\Events\SomeOtherEvent' => integer 1
]
)
编辑
为了让代码更加清晰 - 你可以将以下代码添加到你的基础测试用例文件中:
public function assertEventFiredTimes($event, $count)
{
$this->assertEquals(
count(collect($this->firedEvents)
->groupBy(function($item, $key) { return get_class($item); })
->get($event, [])),
$count
);
}
然后在你的测试中:
$this->assertEventFiredTimes(SomeEvent::class, 3)
不要忘记添加
withoutEvents()
。