gpt4 book ai didi

php - 是否有 Laravel 方式来测试一个事件触发了多少次?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:07:56 26 4
gpt4 key购买 nike

我正在使用带有默认 TestCase.php 文件的基本 PHPUnit 配置文件。

我正在寻找一种方法来检查某个事件是否在测试期间被多次触发。当前代码如下:

function test_fires_multiple_events()
{
$this->expectsEvents(SomeEvent::class);
}

理想情况下,我想要:

function test_fires_multiple_events()
{
$this->expectsEvents(SomeEvent::class)->times(3);
}

最佳答案

在浏览完 MocksApplicationServices 中的代码后,我能够搭载特征,以及它在 withoutEvents() 方法时捕获的字段。

扩展看起来像:

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));

}

逐步了解集合正在做什么:

1) collect($this->firedEvents):获取捕获的事件并将它们存储在集合中。请务必注意,MocksApplicationServices 将每个事件推送到一个数组中,这意味着它已经在计数。

2) groupBy(function($item, $key) { return get_class($item); }):按类名分组,这意味着我们现在有一个数组集合。

3) map(function($item, $key) { .. }:简单地计算 children 的数量。

这导致结构如下:

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()

关于php - 是否有 Laravel 方式来测试一个事件触发了多少次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36261373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com