【问题标题】:How to test in functional test if event has been dispatched如果事件已被调度,如何在功能测试中进行测试
【发布时间】:2016-02-03 17:56:08
【问题描述】:

我正在使用 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 仅包含有关已实际执行某些侦听器的事件的数据。幸运的是,在这种特定情况下执行了一个事件监听器,但我希望它在没有附加任何事件监听器的情况下也能工作,因为我不能肯定这种情况会继续这样。

所以我的问题是,是否有一种方法可以测试是否已调度事件,即保存,即使没有附加事件侦听器。

【问题讨论】:

    标签: php symfony testing phpunit


    【解决方案1】:

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

    【讨论】:

    • 尝试使用$client->get('event_dispatcher)->addEventListener(...)` 来做到这一点,但是由于一段时间以来我遇到了内核似乎为每个请求都重置的问题...会很好仅在此单个测试中包含此侦听器,我认为您建议通过配置添加侦听器,对吗?
    • 是的。取决于您的测试套件的组织方式以及您正在测试的内容。如果您使用来自 Symfony 项目的内核进行测试,您需要在项目级别(测试环境)注册它。您还可以创建一个专门用于测试的内核。如果您要单独测试捆绑包,这很有用。
    【解决方案2】:

    亚格尼。功能测试应基于规范,例如向PUT /api/nodes/ HTTP/1.1 发送一些数据应该会产生一些(理想情况下)对 API 消费者有价值的东西。一些数据操作,我想。测试应确认输出符合特定数据排列的预期。

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

    【讨论】:

    • 嗯,规范的一部分是调度一个事件,以便其他开发人员可以对其作出反应。如果开发框架,这一点尤其重要,因此它不是黑盒的内部实现,而是外部开发人员将依赖的东西。
    • 啊,我明白了。然后你需要模拟一个消费者,并断言它被调用。
    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多