Php 如果事件已调度,如何在功能测试中进行测试

Php 如果事件已调度,如何在功能测试中进行测试,php,symfony,testing,phpunit,Php,Symfony,Testing,Phpunit,我正在使用Symfony中的功能测试测试控制器动作。在这次测试中,我做了如下操作: $client->request( 'PUT', '/api/nodes/', $data ); 之后,我想测试是否已发送某个事件。我之前已经尝试启用探查器(并相应地设置配置),并检查EventDataCollector中的数据: $client->enableProfiler(); $client->request( 'PUT', '/api/node

我正在使用Symfony中的功能测试测试控制器动作。在这次测试中,我做了如下操作:

$client->request(
    'PUT',
    '/api/nodes/',
    $data
);
之后,我想测试是否已发送某个事件。我之前已经尝试启用探查器(并相应地设置配置),并检查
EventDataCollector
中的数据:

$client->enableProfiler();
$client->request(
    'PUT',
    '/api/nodes/' . $data[0]['id'] . '?webspace=sulu_io&language=en',
    $data[0]
);

/** @var EventDataCollector $eventDataCollector */
$eventDataCollector = $client->getProfile()->getCollector('events');
这与预期的一样有效,但问题是
$eventDataCollector
仅包含有关某些侦听器实际已执行的事件的数据。幸运的是,在这种特定情况下执行了一个事件侦听器,但我希望它也能在没有任何事件侦听器的情况下工作,因为我不能确定这种情况是否会继续这样


所以我的问题是,即使没有附加事件侦听器,是否有一种方法可以测试事件是否被调度(即保存)。功能测试应以规范为基础,例如,将一些数据发送到
PUT/api/nodes/HTTP/1.1
应产生对api消费者有价值的结果(理想情况下)。我想是一些数据操作吧。测试应确认输出符合特定数据排列的预期


事件侦听是黑盒的内部实现,不是功能测试的主题。它应该单独测试。启用探查器,您基本上会更改被测系统,并最终测试与生产代码仅部分相关的内容。

Yagni。功能测试应以规范为基础,例如,将一些数据发送到
PUT/api/nodes/HTTP/1.1
应产生对api消费者有价值的结果(理想情况下)。我想是一些数据操作吧。测试应确认输出符合特定数据排列的预期


事件侦听是黑盒的内部实现,不是功能测试的主题。它应该单独测试。启用探查器,您基本上会更改被测系统,并最终测试与生产代码仅部分相关的内容。

您只能在测试环境中注册事件侦听器/订阅服务器。它的唯一目的是让您能够检查事件是否被触发。

您只能在测试环境中注册事件侦听器/订阅者。它的唯一目的是让您能够检查是否触发了事件。

规范的一部分是调度事件,以便其他开发人员可以对其作出反应。如果开发一个框架,这一点尤其重要,因此它不是黑盒的内部实现,而是外部开发人员将依赖的东西。啊,我明白了。然后,您需要模拟偶数的使用者,并断言它被调用。好的,规范的一部分是调度事件,以便其他开发人员可以对其作出反应。如果开发一个框架,这一点尤其重要,因此它不是黑盒的内部实现,而是外部开发人员将依赖的东西。啊,我明白了。然后,您需要模拟偶数的使用者,并断言它已被调用。尝试使用
$client->get('event_dispatcher
)->addEventListener(…)`执行此操作,但由于有一段时间我遇到了一些问题,似乎每个请求都会重置内核。。。在这个测试中只包含这个监听器会很好,我认为您建议通过配置添加监听器,对吗?是的。取决于测试套件的组织方式和测试内容。如果使用来自Symfony项目的内核进行测试,则需要在项目级别(测试环境)注册它。您还可以创建一个专门用于测试的内核。如果您单独测试一个捆绑包,这很有用。尝试使用
$client->get('event\u dispatcher
)->addEventListener(…)`进行测试,但由于我遇到了一些问题,内核似乎会针对每个请求重置。。。在这个测试中只包含这个监听器会很好,我认为您建议通过配置添加监听器,对吗?是的。取决于测试套件的组织方式和测试内容。如果使用来自Symfony项目的内核进行测试,则需要在项目级别(测试环境)注册它。您还可以创建一个专门用于测试的内核。如果要单独测试捆绑包,则此选项非常有用。