MocksApplicationServices
'daki koddan geçtikten sonra, bu özelliği ve withoutEvents()
yöntemini yakaladığı alanları yakalayabildim.
function test_fires_multiple_events()
{
$this->withoutEvents(); // From MocksApplicationServices
$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));
}
neyi koleksiyon yapıyor adım adım için::
uzatma gibi görünecektir
1) collect($this->firedEvents)
: bir koleksiyon yakalanan olayları ve depolar onları götürür. Not etmek önemlidir ki, MocksApplicationServices
her bir olayı bir diziye iter, yani saymaya devam ediyor.
2) groupBy(function($item, $key) { return get_class($item); })
: Sınıf ismine göre gruplar, şimdi dizilerden oluşan bir koleksiyona sahibiz.
3) map(function($item, $key) { .. }
: Sadece çocukları tazeleyin. Sadece biraz bunu temizlemek için
Illuminate\Support\Collection (1) (
protected items -> array (2) [
'App\Events\SomeEvent' => integer 2
'App\Events\SomeOtherEvent' => integer 1
]
)
Düzenleme - Eğer baz testi Dava dosyasında aşağıdakileri ekleyebilirsiniz:
Bu gibi bir yapı ile sonuçlanan
public function assertEventFiredTimes($event, $count)
{
$this->assertEquals(
count(collect($this->firedEvents)
->groupBy(function($item, $key) { return get_class($item); })
->get($event, [])),
$count
);
}
Ve Daha sonra testlerinizde:
$this->assertEventFiredTimes(SomeEvent::class, 3);
withoutEvents()
eklemeyi unutma.
Harika bir yöntem ve zarif bir çözüm, sadece bir şey: Bazen firedEvents dizisi hem dizeleri hem de nesneler olaylarını ("kernel.handled" veya "locale.changed" gibi) içerebilir. Yani kullanmak isteyebilirsiniz: {return is_string ($ item)? $ item: get_class ($ item); } groupBy işlevinde herhangi bir olay türü ile çalışabilir. – kerwan